MySQL 5.5&;5.6默认值
我想澄清一下MySQL 5.5和5.6中默认值的行为。假设我们在MySQL 5.5服务器上有下表:MySQL 5.5&;5.6默认值,mysql,default-value,Mysql,Default Value,我想澄清一下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-
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()中发生了变化,但我不知道如何复制5.5和5.6中的行为
不确定这是否重要,但我们的5.6服务器将explicit\u defaults\u for\u timestamp设置为ON
理想情况下,我想要的是解决这个问题的方法,但如果有人能更好地理解并解释它,那也会很有用
谢谢
编辑:我们正在使用MySQL 5.6.13您是否尝试省略该列
INSERT INTO `test` () VALUES ();
上面5.5中显示的行为实际上是一个bug。这已在5.6.11中修复。看看最底部的图片。它是bugs和16394472的一部分(我实际上找不到链接) 如果关闭时间戳的
explicit\u defaults\u
标志,它应该像5.5中那样工作
当我们从5.5更新到5.6时,这与我在数据库中遇到的问题完全相同 第一次插入本来就不应该起作用。您要求数据库在NOTNULL列中输入NULL值,因此5.6拒绝该选项是正确的。@a_horse_与_no_name的定义是该列不能为NULL-但是,如果提供了默认值,它将使用默认值。编辑、刮that@Shamil您使用的是什么版本的MySQL?行为在5.6.5中发生了变化(我们使用的是5.6.13,我应该在原始帖子中这样说)@Shamil:没有提供默认值,插入指定了一个显式的
NULL
值。仅当未指定列或使用关键字default
时,使用默认值才适用。请阅读此链接:可能会有所帮助。这是对系统变量的explicit\u defaults\u for\u timestamp
的描述,它是在5.6Hi Rob中添加的,这对我的示例有效,但在生产中我们使用Hibernate作为ORM,因此在很多情况下希望能够针对列设置NULL,不管怎样,谢谢。它会导致动态时间戳默认值而不是实际的空值吗?嗯,不确定这是否可能。“将explicit\u defaults\u for\u timestamp设置为OFF”是否实现了这一点?是的,正如我在上面的评论中所说,这对我来说仍然没有意义,但它是有效的!我在对我的回答的评论中也提到了这一点,但其原因有点复杂。您的查询在5.5版本中运行,因为存在一个错误,该错误允许您将列设置为NULL,而实际上您不应该这样做。当5.6推出时,他们将explicit\u defaults\u for\u timestamp
标志设置为允许不推荐的功能在此期间工作。然而,在5.6.11中,他们修复了您(和我的)查询所依赖的bug。幸运的是,对于你和我来说,关闭该标志的新默认行为正是我们想要的行为。这一工作的原因有点复杂。您的查询在5.5版本中运行,因为存在一个错误,该错误允许您将列设置为NULL,而实际上您不应该这样做。当5.6推出时,他们将explicit\u defaults\u for\u timestamp
标志设置为允许不推荐的功能在此期间工作。然而,在5.6.11中,他们修复了您(和我的)查询所依赖的bug。幸运的是,对于你和我来说,关闭该标志的新默认行为正是我们想要的行为。