作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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?
谢谢。
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/
我有一个 PostgreSQL 表,其中有一些字段已编入索引,并且这些字段必须是唯一的以防止重复。这要归功于插入所有字段并捕获 unique_violation 异常的 PLPGSQL 函数,尽管它会
在 PostgreSQL 9.1 版中,我有两个表:ICD9 和 Dx。我现在希望通过将现有记录更改为不同的键值(在 cdesc 中)来更新父表 ICD9。 如果 ICD9 表中不存在新键 (cicd
我是一名优秀的程序员,十分优秀!