我正在向表中添加一列:
ALTER TABLE t ADD c varchar(10) NOT NULL;
添加列,每个记录都有空字符串。
在MySQL 5.5 +的所有条件下(严格模式等),这是否会以这种方式工作?
答案 0 :(得分:36)
在MySQL中,每个列类型都有一个"implicit default" value。
对于字符串类型[隐式]默认值为空字符串。
如果NOT NULL列为added to a table,并且未指定显式DEFAULT,则隐式默认值用于填充新列数据 1 。当指定DEFAULT值时,类似的规则适用。
因此,原始DDL产生的结果与:
相同-- After this, data will be the same, but schema has an EXPLICIT DEFAULT
ALTER TABLE t ADD c varchar(10) NOT NULL DEFAULT ''
-- Now we're back to the IMPLICIT DEFAULT (MySQL stores NULL internally)
ALTER TABLE t ALTER c DROP DEFAULT
“严格”模式设置会影响依赖于默认值的DML语句,但不会影响添加列时的隐式默认用法。
对于没有显式DEFAULT子句的NOT NULL列的数据输入,如果 INSERT或REPLACE语句不包含列的值[和if]启用了严格的SQL模式,则会发生错误..
以下是an sqlfiddle "proof"严格模式不适用于ALTER TABLE .. ADD语句。
1 这是一个MySQL功能。其他引擎(如SQL Server)需要对此类架构更改使用显式DEFAULT(或NULL列)约束。