鉴于以下表格定义:
CREATE TABLE `timestamp_test` (
`timestamp_test_id` bigint(18) NOT NULL AUTO_INCREMENT,
`timestamp_test_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`timestamp_test_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
以下数据:
INSERT INTO `timestamp_test` VALUE (0,'2009-03-09 02:07:01');
INSERT INTO `timestamp_test` VALUE (0,'2009-03-08 02:07:01');
MySQL版本:5.5
编辑: 我收到的错误是:
[SQL]
INSERT INTO `timestamp_test` VALUE (0,'2009-03-08 02:07:01');
[Err] 1292 - Incorrect datetime value: '2009-03-08 02:07:01' for column 'timestamp_test_date' at row 1
答案 0 :(得分:3)
您的查询不正确,应为VALUES
:
INSERT INTO `timestamp_test` VALUE (0,'2009-03-08 02:07:01');
^--- missing S
至于为什么您无法插入第二个值,您可以通过插入具有相同标识值的两条记录0
来导致主键违规。
答案 1 :(得分:2)
TIMESTAMP
数据类型是时区感知的。输入时间从会话的时区转换为UTC,然后再存储为整数,并在SELECT
上转换回会话的时区。
在很多时区,没有2009-03-08 02:07:01 ,因为那个早晨的时钟从01:59:59变为03:00:00,您收到此错误,因为您的会话的当前时区是......其中一个时区。
请注意,如果您尝试将此值从/转换为DST观察时区中的同一时区,时间会如何推进。
mysql> SELECT CONVERT_TZ('2009-03-08 02:07:01','EST5EDT','EST5EDT');
+-------------------------------------------------------+
| CONVERT_TZ('2009-03-08 02:07:01','EST5EDT','EST5EDT') |
+-------------------------------------------------------+
| 2009-03-08 03:00:00 |
+-------------------------------------------------------+
1 row in set (0.00 sec)
答案 2 :(得分:1)
如果您的第一列是自动递增的,则在插入时无需显式设置:
INSERT INTO timestamp_test(timestamp_test_date) VALUES ('2009-03-09 02:07:01');
INSERT INTO timestamp_test(timestamp_test_date) VALUES ('2009-03-08 03:00:00');
VALUE
单数有效,如MySQL文档中所述:http://dev.mysql.com/doc/refman/5.5/en/insert.html
此外,如上所述,由于夏令时在该日期凌晨2点生效,因此日期2009-03-08 02:07:01
未在多个时区发生,从而使其成为2009-03-08 03:00:00
。
答案 3 :(得分:0)
看起来您正在尝试使用相同的主键插入两个记录,并且您在VALUE
的位置使用VALUES
。更新您的INSERT
声明:
INSERT INTO `timestamp_test` VALUES (0, '2009-03-09 02:07:01');
INSERT INTO `timestamp_test` VALUES (1, '2009-03-08 02:07:01');