Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.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 PDO在出现重复密钥的情况下执行2个查询_Php_Mysql_Pdo - Fatal编程技术网

PHP PDO在出现重复密钥的情况下执行2个查询

PHP PDO在出现重复密钥的情况下执行2个查询,php,mysql,pdo,Php,Mysql,Pdo,我目前正在使用此查询 insert into races(race_city_id, race_date, racers, division, elimination) values (:race_city_id, :race_date, :racers, :division, :elimination) on duplicate key update race_city_id = values(race_city_id), race_date = values(race_dat

我目前正在使用此查询

insert into races(race_city_id, race_date, racers, division, elimination)
values (:race_city_id, :race_date, :racers, :division, :elimination)
on duplicate key update
    race_city_id = values(race_city_id),
    race_date = values(race_date),
    racers = values(racers),
    division = values(division),
    elimination = values(elimination);
在比赛日期、赛区和淘汰赛上有唯一的钥匙。我目前正在对重复密钥使用
,但在找到重复密钥时,我需要删除并将新行插入到竞争中(2个查询),或者以某种方式重新生成该行的id字段并更新其中的一些字段。我正在使用InnoDB,我读到当你更新一行时,主键会被重新生成,但我的主键不会。id设置为自动递增,因此我不确定是否有方法重新生成密钥

查询正确地更新了行,但我也只需要重新生成键。

将查询更改为:

replace into races(
  race_city_id, 
  race_date, 
  racers, 
  division, 
  elimination
) values (
  :race_city_id,
  :race_date,
  :racers,
  :division,
  :elimination
)

As
replace into
的工作原理与
insert
完全相同,不同之处在于,如果表中的一个旧行与主键或唯一索引的新行具有相同的值,则在插入新行之前删除旧行,生成一个新id。

您意识到正在使用pdo将值附加到insert上,但不是在重复的钥匙上
在重复键上更新race\u city\u id=values(:race\u city\u id),等等。
@Xorifelse我很确定使用value(xxx)会得到将要插入的值,在本例中它来自pdo。这是我在其他4个查询中使用的。在做了一些研究之后,您似乎是正确的,但是查询执行它读取的操作,它更新了值并保留了id。也许使用
replace-into-races
可以解决您的问题(显然删除了重复密钥更新部分的
)@Xorifelse还有什么方法可以让它重新生成id吗?我想我可以找到每个id的最大值,但之后自动递增功能就会关闭,对吗?