繁体   English   中英

为什么在没有默认值说明的情况下,alter table将空白值设置为新的非null varchar列?

[英]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证明的引用:

MySQL添加一个NOT NULL列

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM