Php MySQL:在两个主键必须匹配的情况下,如何更新重复键?
我需要能够使用mysqli->multi_query在一个查询调用中运行以下所有内容,这就是为什么这很棘手的原因。我有一个由以下列组成的表:Php MySQL:在两个主键必须匹配的情况下,如何更新重复键?,php,mysql,mysqli,Php,Mysql,Mysqli,我需要能够使用mysqli->multi_query在一个查询调用中运行以下所有内容,这就是为什么这很棘手的原因。我有一个由以下列组成的表: 身份证 电子邮件 事件宣传码 事件id 当脚本运行时,如果id和event\u id都匹配现有记录(而不仅仅是一个键或另一个键),我需要能够插入新行或更新行 我现在得到的是: INSERT INTO `rsvps` SET id='$rsvpID', email='$rsvpEmail', event_promo_code='$rsvp
- 身份证
- 电子邮件
- 事件宣传码
- 事件id
id
和event\u 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\u id
设置为键,则当id与记录匹配或事件与记录匹配时,它会进行更新,但在更新之前不会检查两者是否同时匹配。请考虑使用该命令。对于您的情况,从id
和event\u id
创建唯一索引:
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';
REPLACE的工作原理与INSERT完全相同,只是如果表中的一个旧行与主键或唯一索引的新行具有相同的值,则在插入新行之前会删除旧行。参见第13.2.5节“插入语法”
(升级到答案)
表上唯一的唯一的约束应该在组合列(id,event\u id)
上定义。听起来这可能也是你的主键:
ALTER TABLE rsvps DROP PRIMARY KEY, ADD PRIMARY KEY (id, eventid);
(显然,您还需要删除已定义的任何其他唯一
键)。如果只有一个键匹配,会发生什么?是否希望插入失败而不进行更新?如何生成id
?event\u id
是外键列吗?其思想是,只要event\u id不同,就可以多次使用相同的id。所以,如果事件id匹配但id不匹配,它将只执行常规插入。如果id匹配,但事件id不匹配,它也会进行常规插入。@user1418227:在这种情况下,表上唯一的唯一键应为(id,事件id)
。管理员将上载一个CSV文件,其中预填了所有这些列。id不是自动递增的,因为它是由创建这些CSV文件的第三方定义的,只有当id和事件id同时匹配记录时才会替换?因为这就是我要找的。如果两个匹配项中的一个匹配,则不只是更换。如果:id
匹配(主键),或者id
和event\u id
(唯一索引)匹配,而不仅仅是event\u id
匹配,则将进行替换。如果<代码> ID >代码> +>代码>事件ID 匹配是唯一需要的情况,考虑从<代码> ID <代码>和<代码>事件ID >代码中创建创建复合主键,非常感谢!这是有效的,完全有道理。它不让我这样做(id,eventid),直到我掉了另一把钥匙,这就是为什么我以前遇到麻烦。再次感谢!