php – timestamp autoupdate无法使用ON DUPLICATE KEY UPDATE(PDO)

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – timestamp autoupdate无法使用ON DUPLICATE KEY UPDATE(PDO)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个表格作品集,时间戳设置为自动更新.

current_TIMESTamP ON UPDATE CURRENT_TIMESTAMP

PHP中的PDO语句不会导致时间戳更新.

$statement = $this->connection->PRepare("
INSERT INTO folio(publication,productId) 
VALUES(:publication,:productId) 
ON DUPLICATE KEY UPDATE 
id=LAST_INSERT_ID(id),publication=:publication,productId=:productId");

以下手动方法有效但不可取.

$statement = $this->connection->prepare(
"INSERT INTO folio(publication,productId=:productId,timestamp=Now()");

更新:这是我的作品集表结构

CREATE TABLE `folio` (
  `id` int(11) NOT NULL AUTO_INCREMENT,`publication` vArchar(255) DEFAULT NULL,`productId` VARchar(255) DEFAULT NULL,`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,Primary KEY (`id`),unique KEY `unique_folio` (`publication`,`productId`)
) ENginE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

更新2:将timestamp设置为not null后的表结构

CREATE TABLE `folio` (
  `id` int(11) NOT NULL AUTO_INCREMENT,`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`productId`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

解决方法

据我所知,您的查询问题可能是因为您使时间戳字段可以为空

`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

尝试使其为NOT NULL – 因为你有它的有效认值,MysqL不会抱怨你没有提供查询中的值:

`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

另外,尝试将时间戳字段重命名为更合理的东西,例如:

`changed_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

另外,正如我的评论中所述 – 您不需要提供ON DUPLICATE KEY部分中的所有字段,而只需要提供数据字段:

INSERT INTO folio(publication,:productId) 
ON DUPLICATE KEY UPDATE 
    publication=:publication,productId=:productId

这是因为如果MysqL检测到您有重复的键条件,它将不会插入新行,而是更新现有的行,因此必须保持id列不变.

UPDATE

似乎没有更新时间戳列是记录的行为 – MySQL manual for TIMESTAMP columns

引用所需的段落:

因此,您满足所有条件:) – 当您插入记录时,应正确填充时间戳.
但是,当您按顺序提供重复值以更新时间戳时,MysqL会看到您设置行中已存在的值(否则它不会重复),因此它不会更新时间戳列.

因此,解决方案很简单并且已经找到了 – 每当您提供重复值时,都会显式更新时间戳列,例如:

INSERT INTO folio(publication,:productId) 
ON DUPLICATE KEY UPDATE 
    `timestamp` = Now()

无论如何,使时间戳NOT NULL不会受到伤害.

脚本宝典总结

以上是脚本宝典为你收集整理的php – timestamp autoupdate无法使用ON DUPLICATE KEY UPDATE(PDO)全部内容,希望文章能够帮你解决php – timestamp autoupdate无法使用ON DUPLICATE KEY UPDATE(PDO)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。