Referential-Integrity
SQL - 參照完整性 - 外鍵和檢查約束
請讓我知道以下兩個聲明是否相同。
create table R1 ( a INT PRIMARY KEY, b INT references K(w));
注意:K 是一個以單一屬性 w 作為主鍵的表
create table R1 ( a INT PRIMARY KEY, b INT CHECK (b in (SELECT w FROM K));
要回答它們是否等價的問題,您需要聲明 K。假設:
create table K (x int not null primary key, w int, unique(w)); insert into K (x) values (1); insert into K (x) values (2);
以下將滿足 CHECK 約束:
insert into R1 (a,b) values (1,1);
因為:
CHECK (b in (SELECT w FROM K))
評估為:
CHECK (b in (null, null)) <=> CHECK (null)
規則是約束不能評估為假。我不知道任何支持 CHECK 約束中的子查詢的 DBMS,所以我無法驗證。
我針對 PostgreSQL 11 測試了外鍵變體,插入被拒絕
ERROR: insert or update on table "r1" violates foreign key constraint "r1_b_fkey" DETAIL: Key (b)=(1) is not present in table "k".
不完全是 - 對於您的第二個 CREATE 語句,相同的 b 值可以在表 K 中出現多次,而對於第一個語句,它只會出現一次。這很不尋常——你想達到什麼目的?