【问题标题】:MySQL 5.5 & 5.6 default valuesMySQL 5.5 和 5.6 默认值
【发布时间】:2014-03-21 14:49:09
【问题描述】:

我想澄清一下 MySQL 5.5 和 5.6 中默认值的行为。假设我们在 MySQL 5.5 服务器上有下表:

CREATE TABLE `test` (
`TestColumn` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=INNODB DEFAULT CHARSET=utf8;

我可以毫无问题地运行以下查询:

INSERT INTO `test` VALUES (NULL);

创建以下行:

 TestColumn
 2014-02-20 14:55:05

现在,如果我在 MySQL 5.6 服务器上重复相同的测试,插入会失败:

Error Code: 1048
Column 'TestColumn' cannot be null

我知道时间戳自动初始化在 5.6 (http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html) 中发生了变化,但我不知道如何在 5.6 中复制 5.5 中看到的行为。

不确定是否重要,但我们的 5.6 服务器已将 explicit_defaults_for_timestamp 设置为 ON。

理想情况下,我所追求的是对此的解决方案,但如果有人有更好的理解并可以解释它,那也会很有用。

谢谢。

编辑:我们使用的是 MySQL 5.6.13

【问题讨论】:

  • 第一个插入一开始就不应该起作用。您在要求数据库将 NULL 值放入非空列中,因此 5.6 拒绝这样做是正确的。
  • @a_horse_with_no_name 定义是该列不能为空 - 但是,如果提供了默认值,它将使用默认值。编辑,从头开始
  • @Shamil 您使用的是什么版本的 MySQL? 5.6.5 中的行为发生了变化(我们使用的是 5.6.13,我应该在原帖中这么说)
  • @Shamil:没有提供默认值,插入指定了明确的NULL 值。使用默认值仅适用于完全未指定列或使用关键字DEFAULT
  • 请阅读此链接:dev.mysql.com/doc/refman/5.6/en/… 它可能会有所帮助。这是explicit_defaults_for_timestamp系统变量的描述,是5.6加入的

标签: mysql default-value


【解决方案1】:

您在 5.5 中显示的上述行为实际上是一个错误。这已在 5.6.11 中修复。查看底部的release notes for 5.6.11。这是错误 68472 和 16394472 的一部分(我实际上找不到链接)。

如果您关闭 explicit_defaults_for_timestamp 标志,它应该像在 5.5 中那样工作

当我们从 5.5 更新到 5.6 时,这与我们的数据库完全相同的问题。

【讨论】:

  • 这个工作的原因有点复杂。您的查询在 5.5 中工作,因为一个错误允许您将列设置为 NULL,而实际上您不应该这样做。当 5.6 推出时,他们制作了 explicit_defaults_for_timestamp 标志以允许在此期间不推荐使用的功能。但是,在 5.6.11 中,他们修复了您(和我的)查询所依赖的错误。幸运的是,关闭该标志的新默认行为正是我们想要的行为。
【解决方案2】:

您是否尝试省略该列?

INSERT INTO `test` () VALUES ();

【讨论】:

  • 嗨 Rob,这适用于我的示例,但在生产中我们使用 Hibernate 作为我们的 ORM,因此希望能够在很多情况下对列设置 NULL,无论如何,谢谢。
  • 并让它产生动态时间戳默认值而不是实际的空值?嗯。不确定这是否可能。 “将explicit_defaults_for_timestamp 设置为OFF”是否实现了这一点?
  • 确实如此——正如我在上面的评论中所说的那样,它对我来说仍然没有意义,但它确实有效!
  • 我在对我的回答的评论中也说过这一点,但这样做的原因有点复杂。您的查询在 5.5 中工作,因为一个错误允许您将列设置为 NULL,而实际上您不应该这样做。当 5.6 推出时,他们制作了 explicit_defaults_for_timestamp 标志以允许在过渡期间使用已弃用的功能。但是,在 5.6.11 中,他们修复了您(和我的)查询所依赖的错误。幸运的是,关闭该标志的新默认行为正是我们想要的行为。
猜你喜欢
  • 2016-04-22
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多