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)
);

我有两个数据文件,一个用于电影,一个用于剧组,但是当我将剧组数据文件中的数据复制到数据库时,我得到了一个错误
\copy movies from 'movies.tsv';
\copy crew from 'crew.tsv';

在表“crew”上插入或更新违反外键约束
“fk_crew_movies”详细信息:键(tconst)=(tt8038822)不在
表“电影”
因为剧组里的所有数据都没有电影里的身份证。
因此,如果在复制时将数据转储到其他表中并使用delete语句删除数据,则必须忽略或删除该特定数据
DELETE FROM crew1 WHERE tconst not in (SELECT tconst FROM movies);

就像是永远的。我还有别的办法吗?

最佳答案

在实际只需要删除几行的情况下,由于select中使用的构造被称为反连接,并且被查询优化器识别,下面的操作可能会更好。

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)

不带子选择的插入内容版本
 INSERT INTO crew
   SELECT c.* FROM crew1 c
     JOIN movies m ON c.const=m.const

10-04 11:52