我在表中添加一列:
ALTER TABLE t ADD c varchar(10) NOT NULL;
该列被添加,并且每个记录都有一个空字符串。
在MySQL 5.5+中的所有条件下(严格模式等),这种方法是否都能正常工作?
在MySQL中,每个列类型都有一个“ 隐式默认 ”值。
对于字符串类型,[隐式]默认值为空字符串。
如果将NOT NULL列添加到表中,并且未指定显式的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语句不 包含该列的值,并且[如果]启用了严格SQL模式,则会发生错误。
这是sqlfiddle的“证明”,表明严格模式不适用于ALTER TABLE .. ADD语句。
1这是MySQL的功能。其他引擎(例如SQL Server)需要此类架构更改的显式DEFAULT(或NULL列)约束。