3

我一直在阅读如何在重复键上使用 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

4 回答 4

8

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

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

据推测,您想要更新现有记录,因为您不想重复。如果您有时想要重复,但不是针对此特定插入,那么您将需要另一种方法。

于 2013-09-11T19:30:53.027 回答
4

如果我是你,我会用 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);
于 2013-09-11T19:32:02.317 回答
1

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

于 2013-09-11T19:30:24.077 回答
1

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

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

于 2018-03-16T18:12:16.177 回答