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