我正在向表中添加一列:

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,需要对此类架构更改进行显式默认(或空列)约束.

Mysql相关问答推荐

基于多行从表中 Select

可以优化这个带有重复WHERE子句的查询吗?

计算符合字段值只能包含一种事件类型这一事实的记录

如何进行查询以在两个不同的列中搜索两个不同的数据字符串?

替代对多个表执行 FULL OUTER JOIN?

for each 查询设置 MySQL @@session.time_zone 而不是 CONVERT_TZ 的缺点?

创建 mySQL BEFORE/AFTER UPDATE 触发器

0000-00-00 00:00:00 表中的日期设置为 NOT NULL

MySQL 根据另一列中的值更改空值

相关查询 - 在派生表中,我可以有多个嵌套级别吗?

在 Presto Athena 中将字符串转换为数组

在 SQL 中将列添加为 End_date,间隔为 +100 天

SQL 中的双杠 (||) 是什么意思?

如何在 MySQL 中删除具有 2 列作为复合主键的多行?

用于国际和多语言目的的数据库建模

用户 'User'@'%' 和 'User'@'localhost' 不一样吗?

从 MySQL 中的日、月、年字段创建日期

MySQL 连接运算符

带有 LIKE 运算符的 Select 语句中的 MySQL case

"SELECT COUNT(*)" 很慢,即使有 where 子句