php - 时间戳自动更新不适用于 ON DUPLICATE KEY UPDATE (PDO)

标签 php mysql timestamp on-duplicate-key

我有一个时间戳设置为自动更新的表格作品集。

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) 
VALUES(:publication, :productId) 
ON DUPLICATE KEY UPDATE 
id=LAST_INSERT_ID(id), publication=: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;

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

CREATE TABLE `folio` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `publication` varchar(255) DEFAULT NULL,
  `productId` varchar(255) DEFAULT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_folio` (`publication`,`productId`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

最佳答案

据我所知,您的查询问题可能是因为您将 timestamp 字段设置为可空

`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

尝试让它 NOT NULL - 因为你有它的有效默认值,MySQL 不会提示你没有在查询中提供该值:

`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

此外,尝试将 timestamp 字段重命名为更合理的名称,例如:

`changed_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

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

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

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

更新

似乎不更新 timestamp 列是记录在案的行为 - 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).

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

因此,解决方案很简单,您已经找到了 - 每当您提供重复值时显式更新 timestamp 列,例如:

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

无论如何,让 timestamp NOT NULL 不会有坏处。

关于php - 时间戳自动更新不适用于 ON DUPLICATE KEY UPDATE (PDO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24128996/

相关文章:

php - 在javascript中调用php

php - 使用Google Spreadsheet API获取通过过滤器 View 过滤的值

php - 使用php mysql插入后如何获取列值?

php - 将脚本文件存储在 Web 根目录之外

MySQL 5.5 - 如何从具有重复字符串的字段中提取部分文本?

mysql - SQL在查询中将日期字符串转换为unix时间戳

mysql - 将文本时间戳转换为 MySQL 中所有行的日期时间

javascript - JQuery:如何获取日期值 "YYYYMMDDHHMMSSXXX"?

php - 将图像插入 SQL 表

php - 如何将数组放入 SQL 中?