MySQL“插入...在重复键上”,带有多个唯一键

时间:2013-09-11 19:20:18

标签: mysql sql sql-insert on-duplicate-key

我一直在阅读如何在重复键上使用MySQL插入,看看它是否允许我避免选择行,检查它是否存在,然后插入或更新。然而,当我阅读文档时,有一个方面让我感到困惑。这就是文档所说的内容:

  

如果指定ON DUPLICATE KEY UPDATE,并且插入的行将导致UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行的UPDATE

问题是,我不想知道这是否适用于我的问题,因为我没有插入新条件的'条件'是存在一个有两列等于某个值的行,不一定主键是相同的。现在我想象的语法是这个,但我不知道它是否总是插入而不是替换:

INSERT INTO attendance (event_id, user_id, status) VALUES(some_event_number, some_user_id, some_status) ON DUPLICATE KEY UPDATE status=1

问题是,event_id和user_id不是主键,但如果表'attendance'中的行已经包含那些具有这些值的列,我只想更新它。否则我想插入它。 ON DUPLICATE甚至可以实现这一点吗?如果没有,我可以使用其他什么方法?

4 个答案:

答案 0 :(得分:4)

引用包括“UNIQUE索引中的重复值”。因此,您的值不需要是主键:

create unique index attendance_eventid_userid on attendance(event_id, user_id);

据推测,您希望更新现有记录,因为您不需要重复记录。如果你有时需要重复,但不是这个特定的插入,那么你将需要另一种方法。

答案 1 :(得分:3)

如果我是你,我会从event_id和user_id中创建一个主键。这将使ON DUPLICATE非常容易。

SQLFiddle

create table attendance (
    event_id int,
    user_id int,
    status varchar(100),
    primary key(event_id, user_id)
);

然后轻松:

insert into attendance (event_id, user_id, status) values(some_event_number, some_user_id, some_status)
on duplicate key
update status = values(status);

答案 2 :(得分:1)

也许你可以尝试编写一个触发器,在插入之前检查表中是否存在该对(event_id,user_id),如果存在则只更新它。

答案 3 :(得分:1)

对于更广泛的问题“即使PK改变也会INSERT ... ON DUPLICATE尊重英国”,答案是肯定的:SQLFiddle

在这个SQLFiddle中,我插入一个新的记录,带有一个新的PK id,但它的值会违反英国。它执行ON DUPLICATE并保留原始PK ID,但非英国ON DUPLICATE KEY UPDATE值会更改。