【发布时间】:2020-12-23 23:37:47
【问题描述】:
在 Postgres 表中,我还有一个主键(Auto gen)和一个唯一约束。
目前:在使用 SELECT 语句进行 INSERTING 时,如果违反了重复(唯一约束),则它根本不会 INSERT 任何内容。
要求:如果发生任何重复,它应该跳过那些记录,在临时表中捕获它们,并继续插入所有正常的记录(没有约束问题)
表结构:
CREATE TABLE invoice_output (
id SERIAL,
title TEXT UNIQUE NOT NULL,
description TEXT NOT NULL,
CONSTRAINT Invoice_pk PRIMARY KEY(id),
CONSTRAINT title_unique UNIQUE(title)
);
如下调用函数进行插入:
CREATE OR REPLACE FUNCTION public.fn_create_invoice_output(<params>)
RETURNS integer
LANGUAGE plpgsql
AS $function$
...
BEGIN
INSERT INTO public.invoice_output(id,title,description)
SELECT id,title,description FROM public.invoice_input;
IF NOT FOUND THEN
RAISE WARNING 'fn_create_invoice_header_output() - job id or client not found';
status := -1;
END IF;
RETURN status;
END;
$function$
;
我收到 SQL 错误 [23505]:错误:重复键值违反唯一约束。
我怎样才能创建一个例外,以便只插入和提交非重复项。并且重复的键可以从插入中跳过,捕获并打印出来
我在插入语句之后尝试过这个
EXCEPTION WHEN unique_violation THEN RAISE NOTICE 'row skipped in public.fn_create_invoice_output ';
或者我们可以迭代插入命令的select语句的结果集,然后很容易做到吗?
【问题讨论】:
标签: postgresql