Postgres - 使用外键约束导入多行

ant*_*111 3 postgresql foreign-key insert pgadmin

我似乎无法为我的问题找到答案,也许我没有问正确的问题,但它是这样的:

我在 pgAdmin 中基本上有两个表,比如说studentand grades,最终有一个外键约束(student_id 引用 student(id)

CREATE TABLE student (
    id CHAR(2),
    name CHAR(4),
PRIMARY KEY (id));

CREATE TABLE grade (
    student_id CHAR(2),
    grade INT,
FOREIGN KEY (student_id) REFERENCES student(id));
Run Code Online (Sandbox Code Playgroud)

我想做的是将两个文件复制/导入到数据库中。一切对学生都有好处,但我的grade.csv文件将包含不存在的学生 ID,我希望导入忽略而不是插入它们。取而代之的是,命令失败,没有导入任何内容。

什么是正确有效的方法来做到这一点?

dez*_*zso 5

这个问题的解决方案是导入数据时经常使用的方法:使用临时表。

假设您有一个包含两个字段 (student_idgrade)的 CSV 。这grade很好地映射到表格,唯一的问题是不存在的学生。因此,首先创建一个临时表,然后在那里导入数据:

CREATE TEMPORARY TABLE tmp_grade AS 
    SELECT * 
      FROM grade WHERE FALSE;
Run Code Online (Sandbox Code Playgroud)

然后你有多种选择,但它的要点只是从临时表中选择具有匹配学生的行:

INSERT INTO grade
SELECT * 
  FROM tmp_grade
 WHERE EXISTS (SELECT 1 FROM student WHERE id = student_id);
Run Code Online (Sandbox Code Playgroud)

并做了。这的性能取决于数据的大小(不足为奇)。独特的定义student.id表明情况并非如此。但是,如果发生这种情况,您仍然可以尝试使用同一主题的其他变体。

笔记:

  • 选择char(2)作为学生证很有趣。
  • pgAdmin 是 PostgreSQL 的客户端,它本身没有表。