[英]Cross foreign key Postgresql
我需要創建兩個表,例如:
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"
這個錯誤對我來說是有道理的,但我的教授說他所要求的可以做到; 我怎樣才能做到這一點?
有以下三種方法:
首先插入一個id_dean
為 NULL 的faculty
。 然后插入引用該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
,只要你在單個數據庫事務中完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.