繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM