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