我需要创建两个表,例如:
-
Id_faculty_reference
和Id_professor
是主要密钥(有效( -
Id_dean
是参照Id_professor
的外键 -
Id_faculty
是参照Id_faculty_reference
的外键(问题(。
我试过这个:
CREATE TABLE Faculty(
Id_faculty_reference int PRIMARY KEY,
faculty_name varchar,
Id_dean int
);
CREATE TABLE Professors(
Id_professor int PRIMARY KEY,
Name varchar,
Last_name varchar,
Salary int,
Id_faculty int REFERENCES Faculty(id_faculty_reference)
);
ALTER TABLE Faculty ADD FOREIGN KEY (Id_dean)
REFERENCES Professors(id_professor);
当我试图将信息添加到表中时,问题就出现了。如果我试图将信息添加到Faculty
中,则没有引用,因为Professors
是空的:
Key is not present in table "Professors"
如果我试图将信息添加到Professors
中,则没有引用,因为Faculty为空:
Key is not present in table "Faculty"
这个错误对我来说是有道理的,但我的教授说,他要求什么就做什么;我该怎么做?
有三种方法:
-
首先插入一个
faculty
,其中id_dean
为NULL。然后插入引用该faculty
条目的professors
。然后更新第一个条目以指向第二个条目。这是因为
id_dean
可以为NULL,并且不强制执行设置为NULL的外键。一般来说,具有尽可能多的列
NOT NULL
是一个好主意。在这种情况下,请使用其他方法之一。 -
外键在语句末尾进行检查,因此将两行插入一个语句中:
WITH newfac AS ( INSERT INTO faculty (...) VALUES (...) RETURNING id ) INSERT INTO professors (id_faculty, ...) SELECT newfac.id, ... FROM newfac;
-
使用延迟外键约束:
CREATE TABLE faculty( ..., id_dean int REFERENCES professors DEFERRABLE INITIALLY DEFERRED );
这样的外键约束不是在语句末尾检查的,而是在事务末尾检查的。因此,您可以先输入
faculty
,然后输入professors
,只要您在单个数据库事务中输入即可。