【问题标题】:Getting default value error when creating new column创建新列时出现默认值错误
【发布时间】:2021-02-08 12:28:58
【问题描述】:

我有下面的代码,但由于某种原因在 mysql 中运行第二个 alter table 语句以添加新列时出错。我得到的错误是Invalid default value for 'start'

如果我注释掉第二个更改表,它会起作用,因为数据已插入。

CREATE TABLE users (
  id int unsigned NOT NULL PRIMARY KEY,
  name varchar(255) NOT NULL
);



ALTER TABLE users ADD start datetime DEFAULT (DATE_SUB(now(), INTERVAL -1 DAY)) NOT NULL;

insert into users (id, name) values (1, 'usera'), (2, 'usera');

ALTER TABLE users ADD anotherDate datetime DEFAULT (now()) NOT NULL; -- This errors

select * from users;

完整错误是:ERROR 1067 42000 Invalid default value for 'start' 小提琴显示错误:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2df3b421793a7470a321247abec85b47

【问题讨论】:

  • 这能回答你的问题吗? MySQL datetime default time with interval 您不能在默认列中执行此操作。您需要将其设置为日期时间并在插入时进行计算。
  • 哪个版本的mysql?我复制了你的语句,并没有收到错误....(在 MySQL8.0.22 上)
  • @Luuk mysql 8.0.23
  • @ikiK 不,因为这个答案说它根本无法完成。但是我能够做到这一点,因为插入语句有效。它只是第二次更改引发错误。
  • 看到这个 dbfiddle:dbfiddle.uk/… 更改 sql_mode 后,它可以工作

标签: mysql


【解决方案1】:

我从 sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' 开始:

mysql> ALTER TABLE users ADD start datetime DEFAULT (DATE_SUB(now(), INTERVAL -1 DAY)) NOT NULL;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql> insert into users (id, name) values (1, 'usera'), (2, 'usera');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> set sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_IN_DATE';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> ALTER TABLE users ADD anotherDate datetime DEFAULT (now()) NOT NULL;
Query OK, 2 rows affected (0.07 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> set sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_IN_DATE,NO_ZERO_DATE';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> ALTER TABLE users ADD anotherDate2 datetime DEFAULT (now()) NOT NULL;
ERROR 1067 (42000): Invalid default value for 'start'
mysql>

根据https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_zero_in_dateNO_ZERO_IN_DATENO_ZERO_DATE 均已弃用

这是在 MySQL 8.0.22 上

编辑: 哎呀,我必须自己读?

mysql> set sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message
                                                                   |
+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 3135 | 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release. |
+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
猜你喜欢
  • 2021-06-23
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2016-10-11
  • 1970-01-01
相关资源
最近更新 更多