使用MySQL在Insert上检查两列的重复,但两者都不是唯一的

时间:2012-04-05 15:10:29

标签: mysql insert duplicates

这个问题在这里:

MySQL: INSERT IGNORE or ON DUPLICATE KEY UPDATE with checking multiple and not unique columns

相似但不完全。

我正在尝试使用如下表格构建监视列表:

    recordId    |    itemId   |   userId    |    dateAdded

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

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

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

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

是否有一种语句方式可以执行此操作,或者在尝试插入之前是否需要询问数据库userId = & postingUser & and itemId = & requestedId &

1 个答案:

答案 0 :(得分: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列的值