MySQL:我如何进行重复键更新,其中两个主键必须匹配


MySQL: How do I do ON DUPLICATE KEY UPDATE where two primary keys MUST match?

我需要能够使用 mysqli->multi_query 在一个查询调用中运行以下所有内容,这就是为什么这很棘手。我有一个由以下列组成的表格:

  • 编号
  • 电子邮件
  • event_promo_code
  • event_id

运行脚本时,如果 idevent_id 都与现有记录(而不仅仅是一个键或另一个键)匹配,我需要能够插入新行或更新行。

我现在拥有的是:

INSERT INTO `rsvps` 
SET id='$rsvpID', email='$rsvpEmail', 
      event_promo_code='$rsvpEventCode', event_id='$eventID' 
ON DUPLICATE KEY UPDATE id='$rsvpID', 
      email='$rsvpEmail', event_promo_code='$rsvpEventCode', event_id='$eventID';

id是我的主键。如果我还将event_id设置为键,则当 id 与记录匹配或事件与记录匹配时,它会进行更新,但在更新之前不会检查两者是否同时匹配。

升级到答案

表上唯一的UNIQUE约束应在组合列(id, event_id)上定义。 听起来好像这也应该是您的主键:

ALTER TABLE rsvps DROP PRIMARY KEY, ADD PRIMARY KEY (id, eventid);

(显然,您还需要DROP已定义的任何其他UNIQUE键)。

考虑使用 REPLACE 命令。对于您的情况,请从idevent_id创建唯一索引:

REPLACE 的工作方式与 INSERT 完全相同,不同之处在于,如果表中的旧行与主键或 UNIQUE 索引的新行具有相同的值,则在插入新行之前将删除旧行。请参见第 13.2.5 节 "插入语法"。

INSERT INTO rsvps (id, email, event_promo_code, event_id)
 values('$rsvpID', '$rsvpEmail', '$rsvpEventCode', '$eventID')
 ON DUPLICATE KEY 
 UPDATE id='$rsvpID', email='$rsvpEmail', event_promo_code='$rsvpEventCode', event_id='$eventID';