0

这个问题在这里:

MySQL:INSERT IGNORE 或 ON DUPLICATE KEY UPDATE 检查多个而不是唯一的列

相似,但不完全一样。

我正在尝试使用如下表格建立一个观察列表:

    recordId    |    itemId   |   userId    |    dateAdded

recordId 是唯一的unique列,并且是一个自动增量 ID 字段。

itemId、userId 和 dateAdded 可以单独复制,但不能完全复制。

所以,如果用户已经将一个项目添加到他/她的监视列表中,我希望它只更新 dateAdded。

因此,行可能多次包含相同的 userId(因为用户可能希望“观看”多个项目)并且它可能多次包含 itemId(因为同一项目可能被许多用户“观看”)但两者的组合匹配已存在记录的 userId 和 itemId 应该会导致更新。

是否有一个单一的语句方式来做到这一点,或者我是否需要userId = & postingUser & and itemId = & requestedId &在尝试插入之前询问数据库?

4

1 回答 1

1

您可以这样做:

insert into <tablename> (itemId, userId)
values (?, ?)
on duplicate key update dateAdded = now();

? 代表您要插入的新值

这是假设您已经为 定义了唯一索引(itemId, userId)

CREATE TABLE <table> (
  `recordId` int(11) NOT NULL AUTO_INCREMENT,
  `itemId` int(11) DEFAULT NULL,
  `userId` int(11) DEFAULT NULL,
  `dateAdded` timestamp,
  PRIMARY KEY (`recordId`),
  UNIQUE KEY itemuser (`itemId`,`userId`)
) ENGINE=InnoDB;

这是如何工作的:

  • 当您尝试插入一行时,MySQL 将检查键冲突
  • 由于您为 的组合创建了唯一键(itemId, userId),因此将对其进行检查
  • 如果没有冲突,MySQL 将继续插入行
  • 如果存在冲突,MySQL 将回退到该on duplicate key子句,该子句会更新dateAdded列的值
于 2012-04-05T15:49:42.420 回答