我有下面的create table语句。
CREATE TABLE `test_table` (
`id` INT(11) NOT NULL,
`field1` varchar(10),
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
当我进行以下插入时;列"updated_at"不能为null">
insert into test_table (id, field1, updated_at) values (1234, 'foo', null);
我原以为updated_at
在这种情况下会取默认值。
mysql 5.7.12版
然而,当我在mysql 5.6版本中执行此操作时,insert命令可以工作。从5.6到5.7的版本有变化吗?我认为唯一的区别是5.7将NO_ZERO_DATE默认为true。但我以为那只是约会时间。我需要进行配置更改吗?
可以通过不传递updated_at
来实现结果,但在这种情况下,我没有overinsert语句。
我怀疑这与SQL严格模式有关,但我在文档中找不到与您的用例匹配的确切引号。
最重要的是,当您为服务器提供显式null
值时,不应该期望服务器使用默认值。
如果由于某种原因无法从insert
列表中删除该列,则可能的解决方法是使用default
关键字,这将使您的意图变得明确:
insert into test_table (id, field1, updated_at)
values (1234, 'foo', default);
由于启用了explicit_defaults_for_timestamp,因此引发此错误。禁用此功能将解决问题参考:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp