Mysql - 尝试更新时间戳列时。它无法更新

时间:2012-07-02 08:26:13

标签: mysql insert-update

我想我可能在mysql中遇到过一个bug,或者只是我做错了。

过去四个月我一直在使用相同的特定查询,就在今天它以某种方式停止工作。我看不出问题。

我正在mysql控制台中执行这些查询,它运行良好,并且该字段正在更新。但是当PHP执行这些查询时,它会失败。

将记录插入表(带有两个时间戳字段)后,我正在尝试更新特定的时间戳列。

但遗憾的是它无法更新专栏。

查询运行良好(没有错误),但时间戳列中的值仍然保持不变。这很奇怪,因为当我将初始列值保留为NULL时,更新查询会成功。

专栏:

START_DATETIME, END_DATETIME - are "timestamp" type.

插入:

INSERT INTO TABLE1(START_DATETIME, END_DATETIME, RESPONSE) 
VALUES(NOW(), NOW(), 'STARTED')

成功完成插入。 id是123

更新查询与其他任何查询一样正常:

UPDATE TABLE1 
SET END_DATETIME = NOW(), RESPONSE='ENDED'
WHERE ID = 123

更新失败,END_DATETIME未获得NOW()值。

可以用这个复制:

CREATE TABLE TABLE1 
(
    id int auto_increment, 
    start_datetime timestamp, 
    end_datetime timestamp, 
    response varchar(100), 

    primary key(id)
);

3 个答案:

答案 0 :(得分:4)

您可能已经定义了第一个自动插入的时间戳列(START_DATETIME)并使用CURRENT_TIMESTAMP值自动更新(与NOW()相同。< / p>

请注意,如果您没有明确说明TIMESTAMP脚本中CREATE TABLE列的任何内容,则第一个其中一个默认情况下会获得此行为/属性。阅读有关此Automatic Initialization and Updating for TIMESTAMP的MySQL文档,其中包含:

  
      
  • 既不DEFAULT CURRENT_TIMESTAMP也不ON UPDATE CURRENT_TIMESTAMP,与指定DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP相同。
  •   

所以,如果你做SHOW CREATE TABLE tableName,你就会有这样的事情:

CREATE TABLE table1
( ...
, START_DATETIME TIMESTAMP NOT NULL 
                   DEFAULT CURRENT_TIMESTAMP
                   ON UPDATE CURRENT_TIMESTAMP
, ...
) ;

如果您不想要此行为,则应将列定义更改为不自动更新:

ALTER TABLE table1
  MODIFY COLUMN  
    START_DATETIME TIMESTAMP NOT NULL
                     DEFAULT CURRENT_TIMESTAMP ;

答案 1 :(得分:2)

在研究了这个之后,如果第一个表具有ON UPDATE CURRENT_TIMESTAMP,这是我期望的,因为它是由更新到第二个记录自动设置的。

我不认为这可能以前有效;

修复它:

ALTER TABLE TABLE1
    CHANGE COLUMN start_datetime start_datetime TIMESTAMP NULL DEFAULT NULL AFTER id,
    CHANGE COLUMN end_datetime end_datetime TIMESTAMP NULL DEFAULT NULL AFTER start_datetime;

如果您想要日期时间值,TIMESTAMP对此不太好,因为它对自动更新值很有用,因为TIMESTAMP数据类型提供自动初始化和更新到当前日期和时间。有关详细信息,请参阅Automatic Initialization and Updating for TIMESTAMP

如果您需要一个字段,您可以自己管理其他类型

  • DATE
  • DATETIME

可能更合适,请参阅11.3.1. The DATE, DATETIME, and TIMESTAMP Types

答案 2 :(得分:0)

这是时间戳类型的问题,如果您将列更改为日期时间,您将得到您期望的内容