Postgresql
Postgres - 使用外鍵約束導入多行
我似乎找不到我的問題的答案,也許我沒有問正確的問題,但它是這樣的:
我在 pgAdmin 中基本上有兩個表,比如說
student
andgrades
,最終有一個外鍵約束(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_id
和grade
) 的 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 的客戶端,它本身沒有表。