【问题标题】:MYSQL - set default as NULL to all columns, where default is not setMYSQL - 将所有列的默认值设置为 NULL,其中未设置默认值
【发布时间】:2016-12-28 23:35:49
【问题描述】:

我有大约 12 个数据库,每个数据库有 50 个表,其中大多数有 30 多列; db 在严格模式下运行为 OFF,但现在我们必须将 db 迁移到 cleardb 服务,默认情况下严格模式为 ON。 所有具有“非空”约束的表,插入已停止工作,只是因为未传递默认值;而在严格模式为 OFF 的情况下,如果未提供该值,则 MYSQL 将假定列数据类型的默认值。 是否有一个脚本可以用来获取有关所有表的所有列的元数据并生成一个脚本来更改具有此类列的所有表以将默认值更改为“Null”

【问题讨论】:

  • 索取任何场外资源在 SO 上都是题外话。
  • 我不要求任何场外资源@Shadow 我正在寻找有关如何做到这一点的指导,而不是我坐在这里玩弄我的拇指,而有人帮助我。
  • 此外,在定义为非空的字段上将默认字段值设置为空可能不是最好的主意。您的问题意味着您正在寻找一个完整的现有解决方案。 (“有脚本吗……”)。您在解决问题方面没有表现出任何努力,因此您的问题不太可能以目前的形式出现。
  • 这是对的,但有时必须使用给定的东西;设计这个数据库的人可能没有考虑过严格模式。设置 Not Null 并且不提供任何值听起来已经很疯狂了。
  • 你没有明白我的意思:如果一个字段有 not null 限制,然后你将其默认值设置为 null,那么这 2 个设置将相互矛盾。

标签: mysql cleardb


【解决方案1】:

您应该考虑使用information_schema 表来生成DDL 语句来更改表。这种查询将为您提供违规列的列表。

SELECT CONCAT_WS('.',TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME) col  
  FROM information_schema.COLUMNS
 WHERE IS_NULLABLE = 0
   AND LENGTH(COLUMN_DEFAULT) = 0 
   AND TABLE_SCHEMA IN ('db1', 'db2', 'db3')

您可以执行类似的操作来生成ALTER 语句来更改表。但请注意,当您更改某些内容时,MySQL 喜欢重写表。这可能需要一些时间。

不要尝试直接UPDATE information_schema!

您可以尝试在连接到 SaaS 服务时更改 strict_mode 设置,以便您的软件可以兼容地运行。

这是一个大型项目,可能是 cleardb 的重要业务。为什么不向他们寻求帮助以更改 strict_mode 设置?

【讨论】:

  • 信息模式的想法很好,我也在做同样的事情,Cleardb 不会为我做这件事,除非我们切换到专用服务器。
  • 告诉 cleardb 如果他们没有帮助你,你会去 AWS、Rackspace 或 Azure。迁移到云服务已经够难了,无需无缘无故地更改您的业务逻辑。
【解决方案2】:

这是我在@Ollie-jones 脚本的基础上提出的

https://gist.github.com/brijrajsingh/efd3c273440dfebcb99a62119af2ecd5

SELECT CONCAT_WS('.',TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME) col,CONCAT('alter table ',TABLE_NAME,' MODIFY COLUMN ', COLUMN_NAME,' ',DATA_TYPE,'(',CHARACTER_MAXIMUM_LENGTH,') NULL DEFAULT NULL') as script_col
  FROM information_schema.COLUMNS
 WHERE is_nullable=0 
 and length(COLUMN_DEFAULT) is NULL and
 CHARACTER_MAXIMUM_LENGTH is not NULL and 
 table_schema = 'immh' 
 Union
 SELECT CONCAT_WS('.',TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME) col,CONCAT('alter table ',TABLE_NAME,' MODIFY COLUMN ', COLUMN_NAME,' ',DATA_TYPE,' NULL DEFAULT NULL') as script_col
  FROM information_schema.COLUMNS
 WHERE is_nullable=0 
 and length(COLUMN_DEFAULT) is NULL and
 CHARACTER_MAXIMUM_LENGTH is NULL and 
 table_schema = 'immh' 

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多