一尘不染

MySQL添加一个NOT NULL列

sql

我在表中添加一列:

ALTER TABLE t ADD c varchar(10) NOT NULL;

该列被添加,并且每个记录都有一个空字符串。

在MySQL 5.5+中的所有条件下(严格模式等),这种方法是否都能正常工作?


阅读 165

收藏
2021-03-17

共1个答案

一尘不染

在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列)约束。

2021-03-17