我正在向表中添加一列:
ALTER TABLE t ADD c varchar(10) NOT NULL;
Run Code Online (Sandbox Code Playgroud)
添加列,每个记录都有空字符串.
这预计会在MySQL 5.5+的所有条件(严格模式等)下以这种方式工作吗?
use*_*740 40
在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
Run Code Online (Sandbox Code Playgroud)
"严格"模式设置会影响依赖于默认值的DML语句,但不会影响添加列时的隐式默认用法.
对于没有显式DEFAULT子句的NOT NULL列的数据输入,如果INSERT或REPLACE语句不包含列的值[和if]启用了严格的SQL模式,则会发生错误.
这是一个sqlfiddle"证明",严格模式不适用于ALTER TABLE .. ADD语句.
1这是一个MySQL功能.其他引擎(如SQL Server)需要对此类架构更改使用显式DEFAULT(或NULL列)约束.