gpt4 book ai didi

PostgreSQL 多列唯一约束导致错误

转载 作者:行者123 更新时间:2023-11-29 11:48:19 24 4
gpt4 key购买 nike

我是 postgresql 新手,对多列唯一约束有疑问。

尝试向表中添加行时出现此错误:

ERROR:  duplicate key value violates unique constraint "i_rb_on"
DETAIL: Key (a_fk, b_fk)=(296, 16) already exists.

我使用了这段代码(简短版):

INSERT INTO rb_on (a_fk, b_fk) SELECT a.pk, b.pk FROM A, B WHERE NOT EXISTS (SELECT * FROM rb_on WHERE a_fk=a.pk AND b_fk=b.pk);

i_rb_on 是唯一约束/列 (a_fk, b_fk)

我的 WHERE NOT EXISTS 似乎没有针对此类唯一 key 的重复 key 错误提供保护。

更新:

INSERT INTO tabA (mark_done, log_time, tabB_fk, tabC_fk) 
SELECT FALSE, '2003-09-02 04:05:06', tabB.pk, tabC.pk FROM tabB, tabC, tabD, tabE, tabF
WHERE (tabC.sf_id='SUMMER' AND tabC.sf_status IN(0,1)
AND tabE.inventory_status=0)
AND tabF.tabD_fk=tabD.pk
AND tabD.tabE_fk=tabE.pk
AND tabE.tabB_fk=tabB.pk
AND tabF.tabC_fk=tabC.pk
AND NOT EXISTS (SELECT *
FROM tabA
WHERE tabB_fk=tabB.pk AND tabC_fk=tabC.pk);

在选项卡中有唯一索引:

CREATE UNIQUE INDEX i_tabA
ON tabA
USING btree
(tabB_fk , tabC_fk );

只能将(许多行中的)一行插入到 tabA 中。

最佳答案

你的 WHERE NOT EXISTS 从不针对独特的违规行为提供适当的保护。它只是在大多数时候看起来。 WHERE NOT EXISTS可以与另一个插入同时运行,所以该行仍然被多次插入,除了一个插入之外的所有插入都会导致唯一的违规。

出于这个原因,如果行已经存在,最好只运行插入并让违规发生。

除非您显示数据(如 SQL CREATE TABLEINSERT s)和实际查询,否则我无法帮助您解决所描述的确切问题。

顺便说一句,请不要使用旧样式 A, B加入。使用 A INNER JOIN B ON (...) .它可以更容易地判断哪些连接条件应该应用于查询的哪些部分,并且更难忘记连接条件。你似乎已经做到了;您正在尝试插入笛卡尔积。我怀疑这只是查询中的编辑错误。

关于PostgreSQL 多列唯一约束导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18581937/

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