首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误1067 (42000):“end_time”的默认值无效

错误1067 (42000):“end_time”的默认值无效
EN

Stack Overflow用户
提问于 2016-09-17 09:24:24
回答 2查看 12.5K关注 0票数 3
代码语言:javascript
复制
CREATE TABLE seckill (
  `seckill_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '商品库存id',
  `name` VARCHAR(120) NOT NULL COMMENT '商品名称',
  `number` INT NOT NULL COMMENT '库存数量',
  `start_time` TIMESTAMP NOT NULL COMMENT '开始时间',
  `end_time` TIMESTAMP NOT NULL COMMENT '结束时间',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (seckill_id),
  KEY idx_start_time(start_time),
  KEY idx_end_time(end_time),
  KEY idx_create_time(create_time)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='秒杀库存表';

当我尝试使用前面的查询创建表时,我会得到以下错误:

错误1067 (42000):“end_time”的默认值无效

我怎样才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-17 12:55:53

MySQL以一种特殊的方式对待timestamp,当您不知道要寻找什么时,在文档中很难找到:

在MySQL中,时间戳数据类型在非标准方式上与其他数据类型不同:

  • 未使用NULL属性显式声明的时间戳列被分配给NULL属性。(其他数据类型的列,如果未显式声明为NULL,则允许NULL值。)将这样的列设置为NULL将其设置为当前时间戳。
  • 表中的第一个时间戳列(如果不使用NULL属性或显式默认或ON UPDATE子句声明)将自动分配默认CURRENT_TIMESTAMP和UPDATE CURRENT_TIMESTAMP属性。
  • 如果不使用NULL属性或显式DEFAULT子句声明第一个时间戳列,则自动分配默认的'0000-00-00 : 00:00:00‘(“零”时间戳)。对于未为该列指定显式值的插入行,该列被分配为“0000-00-00:00:00:00”,不发生警告。

这些非标准行为仍然是时间戳的默认行为,但从MySQL 5.6.6开始,不推荐使用这些行为,并且在启动时会出现此警告:

不建议使用隐式默认值的警告时间戳。请使用--显式_defaults_FOR时间戳服务器选项(更多细节请参见文档)。

这意味着您的第二个timestamp not null列将得到一个隐式默认值'0000-00-00 00:00:00',这与NO ZERO DATE严格 sql模式(默认情况下在MySQL 5.7中启用)组合在一起是不允许的,并导致错误。

要解决问题,请启用选项--explicit_defaults_for_timestamp。它按照您的预期对待timestamp列(无论如何,这将是未来MySQL发行版中的默认行为),或者允许它们成为null

票数 8
EN

Stack Overflow用户

发布于 2017-10-16 12:54:12

要解决你的问题:

代码语言:javascript
复制
set @@session.explicit_defaults_for_timestamp=on;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39545124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档