【问题标题】:MySQL Update Statement Causing Side EffectsMySQL 更新语句导致副作用
【发布时间】:2018-08-20 20:58:00
【问题描述】:

我有一个如下格式的 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              |
 +------------+-------------+------+-----+-------------------+-----------------------------+

【问题讨论】:

  • @Shef:这不是默认值的问题;更新期间不考虑列的默认值,只考虑插入。
  • @Shef event_time 确实设置为 CURRENT_TIMESTAMP。我已经用表结构和 CREATE TABLE 语句更新了我的问题。我应该如何修改我的 CREATE 语句来解决这个问题。
  • @cdhowie:我的意思是TIMESTAMP 列的默认值。由于我无法编辑,因此删除了评论以避免混淆。 @user840055:问题已经回答了,把event_time栏改成DATETIME类型(即event_time DATETIME)。

标签: mysql sql


【解决方案1】:

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

考虑改用DATETIME

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2016-09-03
      • 2017-09-05
      相关资源
      最近更新 更多