MYSQL - 将所有列的默认值设置为 NULL,其中未设置默认值

MYSQL - set default as NULL to all columns, where default is not set

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

您应该考虑使用 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 设置?

这是我在@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'