如果Postgresql的父表中不存在外键,则忽略复制(读取)行

如果Postgresql的父表中不存在外键,则忽略复制(读取)行,sql,postgresql,Sql,Postgresql,我有两个数据文件,一个用于电影,一个用于剧组,但当我将剧组数据文件中的数据复制到数据库时,我得到了一个错误 CREATE TABLE movies ( tconst varchar(10), titleType text, primaryTitle text, PRIMARY KEY (tconst) ); CREATE TABLE crew( tconst varchar(10) PRIMARY KEY, directors text[], w

我有两个数据文件,一个用于电影,一个用于剧组,但当我将剧组数据文件中的数据复制到数据库时,我得到了一个错误

CREATE TABLE movies (
    tconst varchar(10),
    titleType text, 
    primaryTitle text,
    PRIMARY KEY (tconst)
);

CREATE TABLE crew(
  tconst varchar(10) PRIMARY KEY, 
  directors text[],
  writers text[],
  CONSTRAINT fk_crew_movies FOREIGN KEY (tconst) 
  REFERENCES movies(tconst)
);
表上的插入或更新违反外键约束 fk_乘员电影详细信息:按键tconst=tt8038822不在 桌上电影

这是因为剧组中的所有数据都没有电影数据中的id。 因此,如果我将数据转储到另一个表中,并使用delete语句删除数据,则在复制时必须忽略或删除该特定数据

\copy movies from 'movies.tsv';
\copy crew from 'crew.tsv';

要花很长时间。是否有其他方法可以做到这一点?

在实际只需删除几行的情况下,以下方法可能会更好,因为select中使用的构造称为反连接,并由查询优化器识别

DELETE FROM crew1 WHERE tconst not in (SELECT tconst FROM movies);
不带子选择的插入版本

DELETE FROM crew1
WHERE tconst IN (
    SELECT c.tconst 
    FROM crew1 c LEFT JOIN movies m ON c.const=m.const
    WHERE m.const IS NULL)

嘿,它工作得很好,但为什么下面的陈述要花很长时间?插入crew1中的crew SELECT*,其中tconst在SELECT tconst FROM MONIES中@Eelkear您是否使用较旧版本的postgresql?旧版本不太擅长优化子选择。9.5在大多数情况下都能很好地使用sub-select。请参阅更新答案,了解在不使用sub-select的情况下重写插入的内容。否,它是10.2,此插入语句是否:
 INSERT INTO crew 
   SELECT c.* FROM crew1 c
     JOIN movies m ON c.const=m.const