【发布时间】:2013-11-29 13:41:35
【问题描述】:
如何阻止 Postgres 表出现重复记录,而将重复记录写入另一个表。我想将数据从“table1”复制到“table2”,如果“table1”中有任何重复数据,则应将其复制到“duplicates”而不是“table2”。
问题是:
- 在
table2上创建唯一键会停止数据插入并出现错误
ERROR: duplicate key value violates unique constraint
与 MySQL 不同,可以使用 IGNORE 命令。
-
在
table2上创建规则无助于逐行检查。CREATE RULE "copy_dup" AS ON INSERT TO "table2" WHERE EXISTS (SELECT 1 FROM table2 WHERE (field1, field2, field3) = (NEW.field1, NEW.field2, NEW.field3)) DO INSTEAD INSERT INTO duplicates (field1, field2, field3) VALUES (NEW.field1, NEW.field2, NEW.field3); INSERT INTO "table2" (field1, field2, field3) SELECT field1, field2, field3 FROM table1; -
创建触发器会在以下情况出现语法错误:
CREATE FUNCTION data_insert_table2() RETURNS void AS $$ BEGIN INSERT INTO table2(field1, field2, field3) SELECT field1, field2, field3 FROM table1; END; $$ LANGUAGE plpgsql; CREATE TRIGGER ignore_dup BEFORE INSERT ON table2 FOR EACH ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) EXECUTE PROCEDURE data_insert_table2();错误:在“WHEN”处或附近出现语法错误
触发器不支持WHEN子句吗?
我对 Postgres 不是很熟悉。有人可以帮忙吗?
table1 和 table2 在其 serial_id 上都有主键,不会从一个表复制到另一个表。
我不确定这个函数是否在WHEN 触发失败时起作用。
【问题讨论】:
-
您的
data_insert_table2()的触发函数定义丢失。 -
@ErwinBrandstetter 如果它只到达
WHEN然后肯定会因语法错误而轰炸,这不会有很大的可能性吗? -
此操作是否需要以某种方式按需重复?因为如果不是,您可以制作一对
SELECT查询,选择a)每组重复项中的第一个(包括不重复的行),以及b)每组重复项中的第一个。 (注意asking for help with a possibly non-optimal solution rather than the original problem。) -
@IMSoP:要获得完整的答案,我需要这些详细信息。手头的错误是微不足道的(在
INSERT触发器中使用OLD)... -
另外,
table1中是否有主键?
标签: sql postgresql duplicates postgresql-9.1