对此可能有一个简单而直接的答案,但我对发生的事情感到有些困惑。
我有两个基本表,其中一列具有该表中列的以下属性
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 :(得分: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