[英]Why does alter table set blank values to new not null varchar columns without default value specification?
我有以下MySQL表:
| customers | CREATE TABLE `customers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
COLLATE=utf8_unicode_ci |
该表已经有两行:
+----+-----------+
| id | name |
+----+-----------+
| 1 | John Woo |
| 3 | Maria Loo |
+----+-----------+
2 rows in set (0.00 sec)
我正在尝试使用以下语句更改表:
alter table customers add column (identity varchar(32) not null);
由于我没有指定默认值并且表已经有一些行,因此我希望该语句失败。 但事实并非如此。 相反,它将添加该列,并将''
作为该新列的值设置为所有现有行。
+----+-----------+----------+
| id | name | identity |
+----+-----------+----------+
| 1 | John Woo | |
| 3 | Maria Loo | |
+----+-----------+----------+
2 rows in set (0.00 sec)
有没有一种方法可以使MySQL表现出预期? 我认为可以在MySQL服务器配置变量中设置一些内容。 但我不确定。
有什么帮助吗?
更新请注意,严格模式已打开:
mysql> show variables where variable_name like '%mode%';
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------------------------------------------------------------------- ---------------------+
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | ON |
| offline_mode | OFF |
| pseudo_slave_mode | OFF |
| rbr_exec_mode | STRICT |
| slave_exec_mode | STRICT |
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
9 rows in set (0.00 sec)
原因似乎是对发布到数据库的DML强制采用了严格模式。 DDL不通过DML机制。 为什么会这样呢? 推测-如果数据库所有者希望某列不为null,则数据库将尽最大努力遵守所有者的意图,如果所有者未提供显式默认值,则可以使用隐式默认值功能。
请参阅以下答案以获取对sqlfiddle证明的引用:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.