Foreign-Key

我將使用 MATCH SIMPLE 外鍵做什麼?

  • September 1, 2016

我的理解:

除了對被引用表的有效引用之外,還允許具有外鍵的列包含 NULL 值。SQL 標準為外鍵定義了幾種匹配模式,例如 MATCH SIMPLE 和 MATCH FULL。對於多列外鍵,只要外鍵的至少一列包含 NULL 值,MATCH SIMPLE 就允許任何列中存在錯誤(= 不引用)值。

多列外鍵很少見(因為多列主鍵是),但我可以想像有效的案例。例如,部落格文章的翻譯可能有一個主鍵(post_id, language_id)。現在,引用此類翻譯的內容(例如使用者目前正在編輯的翻譯)將具有多列外鍵。

我不明白的是:

為什麼我會使用 MATCH SIMPLE 作為我的外鍵?

在上面的範例中,有一個僅引用 bypost_id而不是 by的“目前正在編輯”條目是沒有意義的language_id

什麼是有意義的例子*?*

你在問:

什麼是有意義的例子?

這是一個非常簡單的例子:

create table student(snum integer primary key,
                    name text);
create table course(cnum integer primary key,
                   title text);
create table exam (snum integer references student,
                  cnum integer references course,
                  mark integer check (mark >=1 and mark <= 10),
                  primary key(snum, cnum));
create table info (snum integer,
                  cnum integer,
                  info text,
                  foreign key (snum) references student,
                  foreign key (cnum) references course,
                  foreign key (snum, cnum) references exam match simple,
                  check (snum is not null or cnum is not null));
insert into student values (1, 'john'), (2, 'mary'), (3, 'lucy');
insert into course values (1, 'programming'), (2, 'database');
insert into exam values (1, 1, 10), (1, 2, 8), (3, 1, 6), (3, 2, 9);
insert into info values (1, null, 'info about student 1'), 
                       (null, 2, 'info about course 2'), 
                       (1, 1, 'info about exam of student 1 in course 1');

在此範例中,該表info維護有關學生、課程和考試的資訊,我們希望這些資訊保持一致。沒有match simple這個是不可能的。請注意,但是會檢查外鍵:

insert into info values (2, 2, 'info about exam of student 2 in course 2');

ERROR: insert or update on table "info" violates foreign key constraint "info_snum_fkey1"
SQL state: 23503
Detail: Key (snum, cnum)=(2, 2) is not present in table "exam".

最後,請注意,在上面的範例中,您必須至少指定一個學生或一門課程;

insert into info values (null, null, 'nonsense information');

ERROR:  new row for relation "info" violates check constraint "info_check"
DETAIL:  Failing row contains (null, null, nonsense information).

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