gpt4 book ai didi

postgresql - 为什么这个 Postgres 查询抛出 "duplicate key value violates unique constraint"?

转载 作者:行者123 更新时间:2023-11-29 13:02:07 25 4
gpt4 key购买 nike

<分区>

我已经像这样实现了简单的更新/插入查询:

-- NOTE: :time is replaced in real code, ids are placed statically for example purposes
-- set status_id=1 to existing rows, update others
UPDATE account_addresses
SET status_id = 1, updated_at = :time
WHERE account_id = 1
AND address_id IN (1,2,3)
AND status_id IN (2);

-- filter values according to what that update query returns, i.e. construct query like this to insert remaining new records:
INSERT INTO account_addresses (account_id, address_id, status_id, created_at, updated_at)
SELECT account_id, address_id, status_id, created_at::timestamptz, updated_at::timestamptz
FROM (VALUES (1,1,1,:time,:time),(1,2,1,:time,:time)) AS sub(account_id, address_id, status_id, created_at, updated_at)
WHERE NOT EXISTS (
SELECT 1 FROM account_addresses AS aa2
WHERE aa2.account_id = sub.account_id AND aa2.address_id = sub.address_id
)
RETURNING id;

-- throws:
-- PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "..."
-- DETAIL: Key (account_id, address_id)=(1, 1) already exists.

我这样做的原因是:记录可能存在于status_id=2。如果是这样,设置 status_id=1。然后插入新记录。如果它已经存在,但不受第一个 UPDATE 查询的影响,则忽略它(即 status_id=3 的行)。

这很好用,但同时进行时,它会在竞争条件下因重复键而崩溃。但是,如果我试图以原子方式执行“插入不存在的位置”,为什么会出现竞争条件?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com