StackOverflow上有一些类似的问题,但它们似乎与我的情况完全不符。我试图批量插入具有复合唯一约束的PostgreSQL表。我创建了一个没有任何约束的临时表(temptable
),并在其中加载了数据(可能有一些重复的值)。到目前为止,非常好。
现在,我正在尝试使用唯一索引将数据传输到实际表(realtable
)。为此,我使用带有子查询的INSERT语句:
INSERT INTO realtable
SELECT * FROM temptable WHERE NOT EXISTS (
SELECT 1 FROM realtable WHERE temptable.added_date = realtable.added_date
AND temptable.product_name = realtable.product_name
);
但是,我收到了重复的密钥错误:
ERROR: duplicate key value violates unique constraint "realtable_added_date_product_name_key"
SQL state: 23505
Detail: Key (added_date, product_name)=(20000103, TEST) already exists.
我的问题是,WHERE NOT EXISTS条款不应该阻止这种情况发生吗?我该如何解决?
答案 0 :(得分:2)
NOT EXISTS
子句仅阻止temptable
的行与realtable
的现有行冲突;它不会阻止temptable
的多行相互冲突。这是因为SELECT
基于realtable
的初始状态计算一次,而不是在插入每一行后重新计算。
一种解决方案是在GROUP BY
查询中使用DISTINCT ON
或SELECT
,以省略重复项,例如
INSERT INTO realtable
SELECT DISTINCT ON (added_date, product_name) *
FROM temptable WHERE NOT EXISTS (
SELECT 1 FROM realtable WHERE temptable.added_date = realtable.added_date
AND temptable.product_name = realtable.product_name
)
ORDER BY ???; -- this ORDER BY will determine which of a set of duplicates is kept by the DISTINCT ON