我有一个 PostgreSQL 表,其中包含一些索引字段,并且这些字段必须是唯一的以防止重复。这要归功于插入所有字段并捕获 unique_violation 异常的 PLPGSQL 函数,尽管即使只有一个重复,它也会停止插入记录。
由于性能问题,我无法进行多次插入(其中一些以数百次完成),问题是即使只有一个重复,它也会停止所有过程,就像下面示例中最火的两个值一样。
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
有原因的。仍在努力。