2017-10-09 45 views
0

对此,可能有一个简单而直接的答案,但我对发生的事情略有困惑。Mysql - 将空值复制到非空表中

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

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

+0

这可能取决于你在MySQL 设置'explicit_defaults_for_timestamp'系统变量https://dev.mysql.com/doc/refman/5.7/en /服务器系统变量。html#sysvar_explicit_defaults_for_timestamp –

+0

此外,你需要验证你的MySQL是否处于'strict'模式 - 这可能会影响它如何处理'null',因为某些设置会将'null'转换为空字符串,因此' 000-00-00 00:00:00' https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict –

+0

谢谢,这就是我曾经寻找。此变量已启用,但是一旦我禁用它,数据类型时间戳的行为就会发生变化。 –

回答

0

我的第一个问题就是,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 
+0

据我所知,它试图进入列的无效类型,但是当我尝试直接插入空的条目到test2,即插入到test2值(NULL),它会引发错误。我知道它会抛出一个错误,因为我们指定不插入空值,但它没有理解为无效类型,因此应插入为“0000-00-00 00:00:00”,而不是引发错误? –