mysql - 无法为列设置默认空值

标签 mysql

我已经有一个表格,简化示例:

CREATE TABLE t (c INT NOT NULL);

而且我需要将列默认值更改为 NULL,所以我尝试了:

ALTER TABLE t ALTER COLUMN c SET DEFAULT NULL;

但我收到错误“错误代码:1067。‘c’的默认值无效”。 看起来很奇怪,因为查询符合官方文档。

我什至尝试过:

ALTER TABLE t ALTER COLUMN c DROP DEFAULT;

并在它之后进行“SET DEFAULT NULL”查询,但发生了同样的错误。 有趣的是,该查询如下:

ALTER TABLE t ALTER COLUMN c SET DEFAULT 1;

执行无误。

我知道,在我的例子中可以使用以下方法将列默认值更改为 NULL:

ALTER TABLE t MODIFY COLUMN c INT NULL;

但是这个查询在大表上真的很慢(它比像'SET DEFAULT 1'这样的查询慢得多)

那么,如何将默认值更改为 NULL?

我的意思是,没有任何由“修改列”命令引起的开销。

详细信息:MySQL x64 版本 5.7.10,Win8。使用 MySQL Workbench 进行测试。

最佳答案

通过将列创建为 NOT NULL,您已经创建了一个 CONSTRAINT - 声明输入该列的值永远不会为 NULL。

NULL 的默认值(设置为 null 是在 INSERT 期间不存在的值)会创建无效数据。

遗憾的是,可空性约束是 mysql 中数据类型的一部分,使列可为空的唯一方法是

 ALTER TABLE t MODIFY COLUMN c INT NULL;

关于mysql - 无法为列设置默认空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36685216/

相关文章:

php - 如何使用 PHP 连接到在线 MySQL 数据库?

php - 使用 <pre> 标签显示代码

mysql - 在数据库中创建长度为 1 的 long varchar 没有意义吗?

php - 为什么不按照表中的公式计算呢?

android - 在 listView 中反转整个列表

mysql - 如何在mysql中查看时间比较

mysql - 在 SQL 中选择给定时间之前的所有行

mysql - 在 Mac OS X Yosemite 上安装 MySQL 并创建数据库

mysql - 如何在mysql select查询中使用递归

mysql - 如何创建显示过去 4 个季度数据的 View ?