php – timestamp autoupdate无法使用ON DUPLICATE KEY UPDATE(P
我有一个表格作品集,时间戳设置为自动更新.
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 引用所需的段落:
因此,您满足所有条件:) – 当您插入记录时,应正确填充时间戳. 因此,解决方案很简单并且已经找到了 – 每当您提供重复值时,都会显式更新时间戳列,例如: INSERT INTO folio(publication,:productId) ON DUPLICATE KEY UPDATE `timestamp` = NOW() 无论如何,使时间戳NOT NULL不会受到伤害. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |