我有大约 12 个数据库,每个数据库有 50 个表,其中大多数有 30 多列;db 在严格模式下运行为 OFF,但现在我们必须将 db 迁移到 cleardb 服务,默认情况下严格模式为 ON。所有具有“非空”约束的表,插入已停止工作,只是因为未传递默认值;而在严格模式为 OFF 的情况下,如果未提供该值,则 MYSQL 将假定列数据类型的默认值。是否有一个脚本可以用来获取有关所有表的所有列的元数据并生成一个脚本来更改具有此类列的所有表以将默认值更改为“Null”
问问题
2125 次
2 回答
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 设置呢?
于 2016-08-22T12:44:21.843 回答
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'
于 2016-08-23T08:33:40.757 回答