Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL 5.5&;5.6默认值_Mysql_Default Value - Fatal编程技术网

MySQL 5.5&;5.6默认值

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-

我想澄清一下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()中发生了变化,但我不知道如何复制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。幸运的是,对于你和我来说,关闭该标志的新默认行为正是我们想要的行为。