在表之间传输数据违反主键约束

时间:2014-12-19 11:34:35

标签: sql postgresql postgresql-9.3

我正在使用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;

1 个答案:

答案 0 :(得分:1)

通过这些方式思考,你可能会更好。

select a1.article_id, a2.article_id, d.linkedtype
from article a1
inner join data_minerva d on a1.title = d.articletitle and a1.creation_time = d.articlestarttime
inner join article a2 on a2.title = d.linkedarticletitle and a2.creation_time = d.linkedarticlestarttime

可能这需要select distinct而不仅仅是select。您可能还需要检查空文章标题,或者您可能需要单独处理空文章标题。

如果您对此查询返回正确的行感到满意,只需将insert into related_articles置于顶部,然后运行即可。