对于字符串类型,[隐式]默认值为空字符串。
如果将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语句。