[英]MYSQL - set default as NULL to all columns, where default is not set
我大约有12个数据库,每个数据库有50个表,其中大多数都有30多个列。 db在严格模式下以OFF运行,但是现在我们不得不将db迁移到cleardb服务,默认情况下,严格模式为ON。 所有具有“ 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'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.