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
)
Asreplace 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的最大值,但之后自动递增功能就会关闭,对吗?