我想我可能在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)
);
答案 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_TIMESTAMP
和ON 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
如果您需要一个字段,您可以自己管理其他类型
答案 2 :(得分:0)
这是时间戳类型的问题,如果您将列更改为日期时间,您将得到您期望的内容