Cross foreign key Postgresql



我需要创建两个表,例如:

  • Id_faculty_referenceId_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"

这个错误对我来说是有道理的,但我的教授说,他要求什么就做什么;我该怎么做?

有三种方法:

  1. 首先插入一个faculty,其中id_dean为NULL。然后插入引用该faculty条目的professors。然后更新第一个条目以指向第二个条目。

    这是因为id_dean可以为NULL,并且不强制执行设置为NULL的外键。

    一般来说,具有尽可能多的列NOT NULL是一个好主意。在这种情况下,请使用其他方法之一。

  2. 外键在语句末尾进行检查,因此将两行插入一个语句中:

    WITH newfac AS (
    INSERT INTO faculty (...) VALUES (...)
    RETURNING id
    )
    INSERT INTO professors (id_faculty, ...)
    SELECT newfac.id, ...
    FROM newfac;
    
  3. 使用延迟外键约束:

    CREATE TABLE faculty(
    ...,
    id_dean int REFERENCES professors DEFERRABLE INITIALLY DEFERRED
    );
    

    这样的外键约束不是在语句末尾检查的,而是在事务末尾检查的。因此,您可以先输入faculty,然后输入professors,只要您在单个数据库事务中输入即可。

相关内容

  • 没有找到相关文章

最新更新