Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:在两个主键必须匹配的情况下,如何更新重复键?_Php_Mysql_Mysqli - Fatal编程技术网

Php MySQL:在两个主键必须匹配的情况下,如何更新重复键?

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

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

  • 身份证
  • 电子邮件
  • 事件宣传码
  • 事件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),直到我掉了另一把钥匙,这就是为什么我以前遇到麻烦。再次感谢!