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,我希望导入忽略而不是插入它们。取而代之的是,命令失败,没有导入任何内容。
什么是正确有效的方法来做到这一点?
这个问题的解决方案是导入数据时经常使用的方法:使用临时表。
假设您有一个包含两个字段 (student_id和grade)的 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)作为学生证很有趣。