【发布时间】:2014-06-09 21:01:00
【问题描述】:
我有一个将时间戳设置为自动更新的表格作品集。
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;
更新 2:将时间戳设置为非空后的表结构
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;
【问题讨论】:
-
请张贴
folio表结构。此外,您的查询有问题 - 无需更新on duplicate key部分中的所有字段,只需更新publication和productId。而且 - 将您的字段命名为timestamp是一个非常糟糕的主意,因为它是保留字。 -
@AndyW 用表格结构更新问题
-
@AndyW 也没有让您了解“无需更新重复键中的所有字段”也许您在代码中的回答会为我解决这个问题
-
publication 和 productID 的值是否与重复行中的对应列不同?在此处阅读用户评论下的第二条评论:dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html“如果没有任何变化,这将不起作用,可能是因为 MySQL 根本不运行虚拟更新”。
-
@bloodyKnuckles 似乎是这样,我只检查了发布和 productId,它们是执行语句中唯一要更新/插入的字段,这意味着它属于虚拟更新,因此作为一种解决方法,我将在查询中使用 timestamp=NOW(),请发表评论
标签: php mysql timestamp on-duplicate-key