如果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