gpt4 book ai didi

PostgreSQL - 继续 unique_violation (plpgsql)

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

我有一个 PostgreSQL 表,其中有一些字段已编入索引,并且这些字段必须是唯一的以防止重复。这要归功于插入所有字段并捕获 unique_violation 异常的 PLPGSQL 函数,尽管它会停止插入记录,即使只有一个重复项也是如此。

由于性能问题,我无法进行多个 INSERT(其中一些以数百个完成),问题是即使只有一个重复,它也会停止所有进程,如下例中的第一个两个值.

CREATE OR REPLACE FUNCTION easy_import() RETURNS VOID AS
$$
BEGIN
BEGIN
INSERT INTO things ("title", "uniq1", "uniq2") VALUES
('title 1', 100, 102),
('title 2', 100, 102),
('title 3', 101, 102),
('title 4', 102, 102),
('title 5', 103, 102),
('title 6', 104, 102),
('title 7', 105, 102),
('title 8', 106, 102),
('title 9', 107, 102),
('title 10', 108, 102);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- do nothing
END;
END;
$$
LANGUAGE plpgsql;

有没有办法只针对一条记录忽略 unique_violation 并防止它停止进一步的 INSERT?

谢谢。

更新

  • 唯一索引在“uniq1”和“uniq2”字段上有它,很抱歉造成混淆。
  • 虽然@cdhowie 的解决方案似乎是最好的,但它以某种方式忽略了一个事实,即如果您运行相同的查询,它将触发错误。这很奇怪,因为查询执行 JOIN 是有原因的。仍在努力。

最佳答案

假设唯一约束是围绕 uniq1 和 uniq2 复合的,这将起作用:

INSERT INTO things

WITH new_rows (title, uniq1, uniq2) AS (VALUES
('title 1', 100, 102),
('title 2', 100, 102),
('title 3', 101, 102),
('title 4', 102, 102),
('title 5', 103, 102),
('title 6', 104, 102),
('title 7', 105, 102),
('title 8', 106, 102),
('title 9', 107, 102),
('title 10', 108, 102)
)

SELECT
DISTINCT ON (n.uniq1, n.uniq2)
n.title, n.uniq1, n.uniq2

FROM new_rows AS n

LEFT JOIN things AS t
ON n.uniq1 = t.uniq1 AND n.uniq2 = t.uniq2

WHERE t.uniq1 IS NULL;

这实际上可能比单个 INSERT 语句的性能要差,但这是唯一可以解决问题的其他事情。对每种方法进行基准测试,看看哪种方法最适合您。

关于PostgreSQL - 继续 unique_violation (plpgsql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11659945/

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