簡體   English   中英

跨外鍵 Postgresql

[英]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. 首先插入一個id_dean為 NULL 的faculty 然后插入引用該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 ,只要你在單個數據庫事務中完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM