Postgresql

Postgres - 使用外鍵約束導入多行

  • November 2, 2016

我似乎找不到我的問題的答案,也許我沒有問正確的問題,但它是這樣的:

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

我想做的是將兩個文件複製/導入到數據庫中。一切對學生都有好處,但我的grade.csv文件將包含不存在的學生 ID,我希望導入忽略而不插入它們。取而代之的是,命令失敗,沒有導入任何內容。

什麼是正確有效的方法?

這個問題的解決方案是導入數據時經常使用的解決方案:使用臨時表。

假設您有一個包含兩個欄位 (student_idgrade) 的 CSV。這很好地映射到grade表格,唯一的問題是不存在的學生。所以,首先創建一個臨時表,然後在那裡導入數據:

CREATE TEMPORARY TABLE tmp_grade AS 
   SELECT * 
     FROM grade WHERE FALSE;

然後你有多種選擇,但它的要點只是從臨時表中選擇具有匹配學生的行:

INSERT INTO grade
SELECT * 
 FROM tmp_grade
WHERE EXISTS (SELECT 1 FROM student WHERE id = student_id);

並做了。其性能取決於數據的大小(不足為奇)。唯一性的定義student.id表明情況並非如此。但是,如果發生這種情況,您仍然可以使用同一主題的其他變體。

筆記:

  • 選擇char(2)作為學生證很有趣。
  • pgAdmin 是 PostgreSQL 的客戶端,它本身沒有表。

引用自:https://dba.stackexchange.com/questions/154006