我正在向表中添加一列:
ALTER TABLE t ADD c varchar(10) NOT NULL;
列被添加,每条记录都有空字符串.
在MySQL 5.5+中,在所有条件下(严格模式等)都会这样吗?
我正在向表中添加一列:
ALTER TABLE t ADD c varchar(10) NOT NULL;
列被添加,每条记录都有空字符串.
在MySQL 5.5+中,在所有条件下(严格模式等)都会这样吗?
在MySQL中,每种列类型都有一个"implicit default" value.
对于字符串类型,[隐式]默认值为空字符串.
如果NOT NULL列为added to a table,且未指定显式默认值,则隐式默认值将用于填充新列数据1.当指定默认值时,类似的规则也适用.
因此,原始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语句,但不会影响添加列时的隐式默认用法.
对于没有显式默认子句的NOTNULL列中的数据输入,如果INSERT or REPLACE statement不包含该列的值,并且启用了严格SQL模式,则会发生错误..
这里有an sqlfiddle "proof"个严格模式不适用于ALTER TABLE..添加语句.
1这是一个MySQL功能.其他引擎,如SQL Server,需要对此类架构更改进行显式默认(或空列)约束.