加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 21:51:38 所属栏目:PHP教程 来源:网络整理
导读:我有一个表格作品集,时间戳设置为自动更新. CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP PHP中的PDO语句不会导致时间戳更新. $statement = $this-connection-prepare("INSERT INTO folio(publication,productId) VALUES(:publication,:productId) ON DUP
我有一个表格作品集,时间戳设置为自动更新.

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

引用所需的段落:

If the column is auto-updated,it is automatically updated to the current timestamp when the value of any other column in the row is changed from its current value. The column remains unchanged if all other columns are set to their current values. To prevent the column from updating when other columns change,explicitly set it to its current value. To update the column even when other columns do not change,explicitly set it to the value it should have (for example,set it to CURRENT_TIMESTAMP).

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读