Referential-Integrity

SQL - 參照完整性 - 外鍵和檢查約束

  • July 9, 2020

請讓我知道以下兩個聲明是否相同。

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 中出現多次,而對於第一個語句,它只會出現一次。這很不尋常——你想達到什麼目的?

引用自:https://dba.stackexchange.com/questions/68292