为何PDO预处理UPDATE语句未指定datetime列却自动更新该列?
为什么我的PDO更新语句会自动修改未提及的datetime列?
别担心,这可不是你的PHP/PDO代码出问题了——问题根源在数据库表的列属性设置上!
你表中的lastLoginDate列,大概率被配置了ON UPDATE CURRENT_TIMESTAMP的属性(常见于MySQL这类数据库)。这个属性的作用是:当你对该行的任意字段执行UPDATE操作时,数据库会自动把这个列的值更新为当前时间,哪怕你的UPDATE语句里根本没提到它。
怎么验证这个猜测?
登录你的数据库,执行这条SQL语句查看表结构:
SHOW CREATE TABLE users_edi;
在输出的表结构定义里,找到lastLoginDate列,你会看到类似这样的配置:
lastLoginDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
重点就是ON UPDATE CURRENT_TIMESTAMP这部分——它就是自动更新的触发源。
如何解决这个问题?
如果你不希望这个列在更新其他字段时自动变化,需要修改表结构移除这个属性:
ALTER TABLE users_edi MODIFY COLUMN lastLoginDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
(如果这个列原本没有DEFAULT CURRENT_TIMESTAMP的默认值,就去掉这部分,保留你实际需要的默认配置即可)
补充一句:这种ON UPDATE的设计通常是用来记录行的最后修改时间的,但如果不符合你的业务需求,调整表结构就能解决问题。你的PDO代码本身完全没问题,它只是执行了你指定的更新操作,自动更新是数据库层面的内置逻辑。
内容的提问来源于stack exchange,提问作者John Beasley
相关产品推荐
相关产品推荐

