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

时间:2016-08-22 12:09:10

标签: mysql cleardb

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

2 个答案:

答案 0 :(得分:2)

您应该考虑使用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设置时请求他们帮忙?

答案 1 :(得分:0)

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