1

我注意到,如果引用的密鑰不是唯一的,則不能創建外鍵,但如果我有記錄(x, y, z),其中x是唯一的,則假設每個記錄總是唯一的,這是「直觀的」。PostgreSQL - 爲什麼我不能創建基於唯一列的複合外鍵而沒有聲明組合鍵是唯一的?

那麼,是不是還有我還沒有考慮過爲什麼我不能做這樣的事情

create table x(
    id int primary key, 
    something int not null 
); 
create table y(
    id serial primary key, -- whatever, this doesn't matter 
    x_id int not null, 
    x_something int not null, 
    foreign key (x_id, x_something) 
     references x(id, something) 
); 
Postgres裏

會拋出

ERROR: there is no unique constraint matching given keys for referenced table "x" 

和可校正增加任何特別的理由unique (id, something),表x

此行爲僅存在於Postgres中,還是SQL標準中定義的內容?

有什麼辦法可以引用組合鍵而不需要unique約束?

編輯1: 這裏的情況的一個例子中,這將是

create table movie_reservation(
    id serial primary key, 
    movie_id int references(...), 
    -- ... (reservation data like the time and interval), 
    seen boolean not null default false -- wether a user has seen it 
); 
-- want califications of moves that HAVE BEEN SEEN 
create table movie_calification(
    movie_reservation_id int not null, 
    seen boolean 
     not null 
     check (boolean = true), 
    stars smallint 
     not null 
     check (stars between 1 and 5), 


    foreign key (movie_reservation_id, seen) 
     references movie_reservation(id, seen) 
); 

回答

1

大多數數據庫需要一個外鍵約束是一個主鍵或唯一鍵(有用其中任可以是複合的)。

我不知道擴展功能允許來自主鍵或唯一鍵的列的超集。也許有些數據庫確實允許。另一方面,當一個較小的集合工作時,我不能輕易想到使用額外的輔助鍵。

(警告:其實我能想到的情況,但Postgres有使用不必要的表繼承製。)

+0

+1 metioning表繼承,我不知道這樣的功能,也至極解決我的具體問題。謝謝! –