我正在使用postgres处理数据库项目。我有一个大表,其中包含从csv文件导入的数据,我需要将其转移到代表我设计的数据库的其他较小表中。在表之间传输数据违反主键约束
与导入数据的大表被称为data_minerva
,我要传输部分数据的表被称为related_articles
。下面是DDL部分代码:
CREATE SEQUENCE article_id_seq;
CREATE TABLE article (
article_id integer UNIQUE NOT NULL DEFAULT nextval('article_id_seq'),
title varchar,
body varchar,
publish_time timestamp,
creation_time timestamp,
id integer,
PRIMARY KEY (article_id),
FOREIGN KEY (id) REFERENCES team (id)
);
ALTER SEQUENCE article_id_seq OWNED BY article.article_id;
CREATE TABLE related_articles (
article_id1 integer NOT NULL,
article_id2 integer NOT NULL,
kind varchar,
PRIMARY KEY (article_id1, article_id2, kind),
FOREIGN KEY (article_id1) REFERENCES article (article_id),
FOREIGN KEY (article_id2) REFERENCES article (article_id)
);
正如你可以在上面的代码片断看到一篇文章被定义由它的ID。 data_minerva
表不包含ID列。现在,当我想要将数据从data_minerva
传输到related_articles
时,我遇到了data_minerva
表中存在重复的问题,它们违反了表related_articles
表的主键约束。不过,我试图创建一个规则来忽略这些重复,但没有成功。我想我需要用SELECT DISTINCT
做更多的事情,但我无法弄清楚。我用来传输数据的查询:
CREATE RULE "ignore" AS ON INSERT TO related_articles
WHERE EXISTS (SELECT 1 FROM related_articles WHERE article_id1=NEW.article_id1 AND article_id2=NEW.article_id2 AND kind=NEW.kind)
DO INSTEAD NOTHING;
INSERT INTO related_articles (article_id1, article_id2, kind)
SELECT DISTINCT ON (data_minerva.articletitle, data_minerva.articlestarttime, data_minerva.writeremail,article.id, article.id, data_minerva.linkedarticletitle, data_minerva.linkedarticlestarttime)
(SELECT article_id FROM article WHERE data_minerva.linkedarticletitle IS NOT NULL AND article.title=data_minerva.articletitle AND article.creation_time=data_minerva.articlestarttime::timestamp),
(SELECT article_id FROM article WHERE article.title=data_minerva.linkedarticletitle AND article.creation_time=data_minerva.linkedarticlestarttime::timestamp),
linkedtype FROM data_minerva, article WHERE data_minerva.linkedarticletitle IS NOT NULL;
搜索“插入是否存在” – 2014-12-19 12:29:59