【问题标题】:Mysql - Copying a null value into a not null tableMysql - 将空值复制到非空表中
【发布时间】:2017-10-09 09:24:06
【问题描述】:

对此可能有一个简单直接的答案,但我对正在发生的事情感到有些困惑。

我有两个基本表,每列有一列,该表中的列具有以下属性

CREATE TABLE test (correct_time timestamp NULL DEFAULT NULL)
CREATE TABLE test2 (correct_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)

然后我将NULL 值插入test,即

INSERT INTO test ( correct_time ) VALUES (NULL)

现在我尝试将所有条目从test 复制到test2

INSERT INTO test2 SELECT * FROM test

这会在test2 中生成一个结果,其中的值现在是0000-00-00 00:00:00

我的第一个问题是,test2 的默认值是CURRENT_TIMESTAMP,那么为什么null 的值是0000-00-00 00:00:00,而不是最近的时间?

此外,这会产生警告,column 'correct_time' cannot be null。因此,如果我们要插入 NULL 值,为什么将其设置为 0000-00-00 00:00:00 而不是抛出错误。

【问题讨论】:

  • 这可能取决于您在 MySQL dev.mysql.com/doc/refman/5.7/en/… 中为 explicit_defaults_for_timestamp 设置的系统变量
  • 此外,您需要验证您是否在strict 模式下拥有MySQL - 这会影响它处理null 的方式,因为某些设置会将null 转换为空字符串,因此000-00-00 00:00:00dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict
  • 谢谢,这就是我要找的。此变量已启用,但是一旦我禁用它,数据类型时间戳的行为就会改变。

标签: mysql null notnull


【解决方案1】:

我的第一个问题是,test2 的默认值是CURRENT_TIMESTAMP,那么为什么null 的值是0000-00-00 00:00:00,而不是最近的时间?

这是因为,当没有值插入该列时使用默认值。这里它从test.correct_time 中选择null 值并尝试插入test2.correct_time

此外,这会产生一个警告,column 'correct_time' cannot be null。因此,如果我们要插入 NULL 值,为什么将其设置为 0000-00-00 00:00:00 而不是抛出错误。

警告是因为插入的数据类型与列的类型不匹配。这也是为什么值设置为0000-00-00 00:00:00的原因。

要理解这一点,试试这个:

INSERT INTO test2 VALUES ()

这应该存储默认值。

我假设您的表格中有更多列。您可以像这样运行查询两次:

INSERT INTO test2 (SELECT * FROM test WHERE correct_time IS NOT NULL)
INSERT INTO test2 (SELECT column1, column2 FROM test WHERE correct_time IS NULL) -- select all columns except correct_time 

【讨论】:

  • 我知道它是试图输入列的无效类型,但是当我尝试将空条目直接插入 test2 时,即插入 test2 值 (NULL) 时,它会引发错误。我知道它会引发错误,因为我们指定不插入空值,但它的空值不被理解为无效类型,因此应该插入为“0000-00-00 00:00:00”而不是引发错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2013-12-14
  • 2018-05-17
  • 1970-01-01
相关资源
最近更新 更多