4

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

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

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

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

但不幸的是,它无法更新该列。

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

列 :

START_DATETIME, END_DATETIME - are "timestamp" type.

插入:

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

插入成功。编号为 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)
);
4

3 回答 3

4

您可能已经将第一个时间戳列(那个START_DATETIME)定义为自动插入并使用CURRENT_TIMESTAMP值自动更新(与NOW().

请注意,如果您没有明确说明脚本中的TIMESTAMP列的任何内容,则它们中的一个默认情况下会获得此行为/属性。阅读有关此自动初始化和更新的 MySQL 文档,其中指出:CREATE TABLETIMESTAMP

  • 没有DEFAULT CURRENT_TIMESTAMP也没有ON UPDATE CURRENT_TIMESTAMP,它与同时指定DEFAULT CURRENT_TIMESTAMP和相同ON UPDATE CURRENT_TIMESTAMP

所以,如果你做 a 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 ;
于 2012-07-02T08:55:03.467 回答
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 数据类型提供自动初始化和更新到当前日期和时间。有关更多信息,请参阅TIMESTAMP 的自动初始化和更新

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

  • 日期
  • 约会时间

可能更合适,见11.3.1。DATE、DATETIME 和 TIMESTAMP 类型

于 2012-07-02T08:30:42.123 回答
0

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

于 2012-07-02T08:57:17.213 回答