我需要能够使用 mysqli->multi_query 在一个查询调用中运行以下所有内容,这就是为什么这很棘手。我有一个由以下列组成的表格:
- 编号
- 电子邮件
- event_promo_code
- event_id
运行脚本时,如果 id
和 event_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 命令。对于您的情况,请从id
和event_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';