Database 交叉外键Postgresql
我需要创建两个表,例如:Database 交叉外键Postgresql,database,postgresql,foreign-keys,primary-key,Database,Postgresql,Foreign Keys,Primary Key,我需要创建两个表,例如: Id\u faculty\u reference和Id\u professor是主键(有效) Id\u dean是一个外键,与Id\u professor Id\u faculty是一个外键,指向Id\u faculty\u reference(问题) 我试过这个: CREATE TABLE Faculty( Id_faculty_reference int PRIMARY KEY, faculty_name varchar,
和Id\u faculty\u reference
是主键(有效)Id\u professor
是一个外键,与Id\u dean
Id\u professor
是一个外键,指向Id\u faculty
(问题)Id\u faculty\u 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);
当我尝试向表中添加信息时,问题就出现了。如果我试图将信息添加到教员
,则没有参考,因为教授
为空:
键不在表“Professors”中
如果我试图将信息添加到教授
,则没有参考,因为教员是空的:
键不在表“Faculty”中
这个错误对我来说是有道理的,但我的教授说他所要求的是可以做到的;我如何才能做到这一点?有三种方法:
faculty
,其中id\u dean
为空。然后插入引用该教员
条目的教授
。然后更新第一个条目以指向第二个条目
这是因为id\u dean
可以为NULL,并且不强制执行设置为NULL的外键
一般来说,最好尽可能多的列notnull
。在这种情况下,请使用其他方法之一
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
);
这样的外键约束不会在语句末尾检查,而是在事务末尾检查。因此,您可以首先输入教员
,然后输入教授
,只要您在单个数据库事务中输入即可