MySQL添加一个NOT NULL列

Pau*_*per 31 mysql sql

我正在向表中添加一列:

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

  • 注意:MariaDB 也对此进行了更改,因此在 MariaDB 中,用户必须为 NOT NULL 列提供显式 DEFAULT 值。 (2认同)