Mysql - 将空值复制到非空表中

时间:2017-10-09 09:24:07

标签: mysql null notnull

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

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

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而不是抛出错误。

1 个答案:

答案 0 :(得分:0)

  

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

这是因为,当没有值插入该列时,将使用默认值。在这里,它从null中选择test.correct_time值并尝试插入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