我有一个MySQL表格,格式如下:
mysql> select event_time, count, result, pcm_id from Events_CallMeBack_2011_08_05 WHERE pcm_id=1566;
+---------------------+-------+--------+--------+
| event_time | count | result | pcm_id |
+---------------------+-------+--------+--------+
| 2011-08-05 23:45:04 | 0 | NULL | 1566 |
+---------------------+-------+--------+--------+
1 row in set (0.00 sec)
问题在于,当我运行修改结果列的UPDATE查询时,event_time也会作为副作用进行更新。我不知道为什么会发生这种情况:当我尝试更新结果列时,我当然不希望更新event_time字段。
以下是查询:
UPDATE Events_CallMeBack_2011_08_05 SET result ='D' WHERE pcm_id = '1566'
这是运行UPDATE语句后的结果列。
mysql> select event_time, count, result, pcm_id from Events_CallMeBack_2011_08_05 WHERE pcm_id=1566;
+---------------------+-------+--------+--------+
| event_time | count | result | pcm_id |
+---------------------+-------+--------+--------+
| 2011-08-20 19:40:21 | 0 | D | 1566 |
+---------------------+-------+--------+--------+
1 row in set (0.00 sec)
event_time列已更新为mysql服务器的当前本地时间。
我的初步分析是mysql会自动更新Update语句中的event_time(TIMESTAMP)列。 CREATE TABLE语句没有指定这个,所以我很清楚为什么会发生这种情况。
创建声明:
strSql = "CREATE TABLE " + strTableName +
"(id INT NOT NULL, event_time TIMESTAMP,....
表格如下所述。
mysql> describe Events_CallMeBack_2011_08_05;
+------------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | NO | | NULL | |
| event_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| event_code | varchar(30) | YES | | NULL | |
| count | int(11) | YES | | 0 | |
| result | varchar(1) | YES | | NULL | |
| pcm_id | int(11) | NO | PRI | NULL | auto_increment |
+------------+-------------+------+-----+-------------------+-----------------------------+
答案 0 :(得分:1)
event_time
列可能是使用TIMESTAMP
类型声明的。此类型的列设置为插入或更新行时的当前时间。
请考虑使用DATETIME
。
答案 1 :(得分:1)
是的,这是TIMESTAMP数据类型的documented behavior。每次更新行时它都会更新为当前时间。
既没有DEFAULT也没有ON UPDATE子句,它与DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP相同。
如果使用常量默认值(例如0)定义TIMESTAMP列,则可以覆盖此行为。阅读手册页了解更多详情。