【发布时间】:2020-11-11 23:19:59
【问题描述】:
我遇到了一个不常见但令人沮丧的问题,即 Postgres 似乎遗漏了我的主键冲突,并为唯一索引抛出了一个错误,我没有将其放入我的 ON CONFLICT 中。
一个例子是:
表:users
列:id (pkey), ext_id (unique index), attr1, attr2
INSERT INTO users("id", "ext_id", "attr1", "attr2")
VALUES (1, 123, 'a thing', 'something')
ON CONFLICT (id) DO UPDATE
SET "ext_id" = excluded.ext_id, "attr1" = excluded.attr1, "attr2" = excluded.attr2
有时它运行得很好,但有时它告诉我ERROR: duplicate key value violates unique constraint "index_users_on_ext_id"
我确定我缺少一些东西,但我不知道是什么。我是否需要从 SET 中删除唯一列?为什么这不总是抛出错误?
【问题讨论】:
-
显示表中的数据以及您尝试插入的数据,当这种“有时”发生时。只有一个地方可以触发唯一冲突,这就是
ext_id上的唯一索引。也许某些行已经有相同的ext_id。 -
将
ON CONFLICT (id)更改为ON CONFLICT (id, ext_id)。 -
@AdrianKlaver 即使我没有 id 和 ext_id 的复合索引也可以使用?
标签: sql postgresql