MySQL更新声明导致副作用

时间:2011-08-20 18:44:36

标签: mysql sql

我有一个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              |
 +------------+-------------+------+-----+-------------------+-----------------------------+

2 个答案:

答案 0 :(得分:1)

event_time列可能是使用TIMESTAMP类型声明的。此类型的列设置为插入或更新行时的当前时间。

请考虑使用DATETIME

答案 1 :(得分:1)

是的,这是TIMESTAMP数据类型的documented behavior。每次更新行时它都会更新为当前时间。

  

既没有DEFAULT也没有ON UPDATE子句,它与DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP相同。

如果使用常量默认值(例如0)定义TIMESTAMP列,则可以覆盖此行为。阅读手册页了解更多详情。