MySQL添加非空列

54

我正在给一个表添加一列:

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

新增了该列,每条记录都是空字符串。

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


11
是的,否则将无法向表中添加新列。新列将设置其值为该列的默认值,或其类型的适当“自动默认”值。对于“varchar not null”,这是一个空字符串。 - Marc B
@MarcB,我也是这么想的。谢谢你的确认。 - Paul Draper
4
如用户2864740所说,@MarcB,这是完全可能的。您只需要指定默认值,其他DBMS在此处也需要。 - Matthew Flaschen
1个回答

72
在MySQL中,每个列类型都有一个"隐式默认"值
对于字符串类型,[隐式]默认值是空字符串。
如果向表中添加一个非空列,并且没有指定显式的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

"strict" 模式设置影响依赖于默认值的 DML 语句,但不影响在添加列时隐式默认使用的情况。
对于没有显式 DEFAULT 子句的 NOT NULL 列的数据输入,如果 INSERT 或 REPLACE 语句不包含该列的值,并且启用了严格 SQL 模式,则会出现错误。
这里是一个 an sqlfiddle "proof",证明严格模式不适用于 ALTER TABLE .. ADD 语句。

1这是MySQL的一个特性。其他引擎,如SQL Server,在进行此类模式更改时需要显式设置DEFAULT(或NULL列)约束。


2
注意:MariaDB也已经更改了这一点,因此在MariaDB中,用户必须为NOT NULL列提供显式的DEFAULT值。 - Matthias Wimmer
有必要同时使用NOT NULL和DEFAULT吗?因为有了指定的默认值,它永远不会为空。 - T S
@TS 是的,如果你想要强制值始终不为 null。例如,如果列上仅有一个 DEFAULT,那么可能会出现 INSERT INTO t SET c = NULL 的情况 - 但是如果该列上有 NOT NULL,那么这个语句将失败。 - aland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接