[英]How to reference multiple foreign keys in a table that is a primary key and candidate keys?
我有 2 張桌子:
CREATE TABLE PERSON(
passportNumber VARCHAR(20) NOT NULL,
firstName VARCHAR(30) NOT NULL,
lastName VARCHAR(30) NOT NULL,
dateOfBirth DATE NOT NULL,
gender CHAR(1) NOT NULL,
CONSTRAINT person_pkey PRIMARY KEY(passportNumber),
CONSTRAINT person_ckey1 UNIQUE(firstName, lastName, dateOfBirth)
);
CREATE TABLE CHEF(
culinaryCerts VARCHAR(300) NOT NULL,
competitionEXpr VARCHAR(300) NULL,
passportNumber VARCHAR(20) NOT NULL,
firstName VARCHAR(30) NOT NULL,
lastName VARCHAR(30) NOT NULL,
dateOfBirth DATE NOT NULL,
CONSTRAINT chef_pkey PRIMARY KEY(passportNumber),
CONSTRAINT chef_ckey1 UNIQUE(firstName, lastName, dateOfBirth),
CONSTRAINT chef_fkey1 FOREIGN KEY(passportNumber)
REFERENCES PERSON(passportNumber)ON DELETE CASCADE,
CONSTRAINT chef_fkey2 FOREIGN KEY(firstName)
REFERENCES PERSON(firstName)ON DELETE CASCADE,
CONSTRAINT chef_fkey3 FOREIGN KEY(lastName)
REFERENCES PERSON(lastName)ON DELETE CASCADE,
CONSTRAINT chef_fkey4 FOREIGN KEY(dateOfBirth)
REFERENCES PERSON(dateOfBirth)ON DELETE CASCADE);
但是,當我運行代碼時,它顯示:
錯誤代碼:1822。無法添加外鍵約束。 引用表 'PERSON' 中缺少約束 'chef_fkey3' 的索引
您不需要CHEF
表中的firstName
、 lastName
和dateOfBirth
屬性,因為您可以在PERSON
檢索它們,並在一個簡單的連接中使用passportNumber
外鍵。
當屬性是主鍵/外鍵或存在唯一約束的成員時,您也不需要指定NOT NULL
。
您可以像這樣簡化腳本:
CREATE TABLE PERSON (
passportNumber VARCHAR(20),
firstName VARCHAR(30),
lastName VARCHAR(30),
dateOfBirth DATE,
gender CHAR(1) NOT NULL,
CONSTRAINT person_pk PRIMARY KEY (passportNumber),
CONSTRAINT person_ckey1 UNIQUE(firstName, lastName, dateOfBirth)
);
CREATE TABLE CHEF (
culinaryCerts VARCHAR(300) NOT NULL,
competitionEXpr VARCHAR(300),
passportNumber VARCHAR(20),
CONSTRAINT chef_pk PRIMARY KEY (passportNumber),
CONSTRAINT chef_fk1 FOREIGN KEY (passportNumber) REFERENCES PERSON(passportNumber)
);
然后像這樣檢索您的數據:
SELECT *
FROM PERSON AS p
INNER JOIN CHEF AS c
ON p.passportNumber = c.passportNumber
您在firstName , lastName , dateOfBirth
上有一個組合的唯一約束firstName , lastName , dateOfBirth
因此您的外鍵需要包含所有列,如下例所示。
但是如果您需要將所有三個分開,您還需要在 Persons 表中單獨定義每一列
CREATE TABLE PERSON ( passportNumber VARCHAR(20) NOT NULL, firstName VARCHAR(30) NOT NULL, lastName VARCHAR(30) NOT NULL, dateOfBirth DATE NOT NULL, gender CHAR(1) NOT NULL, CONSTRAINT person_pkey PRIMARY KEY (passportNumber), CONSTRAINT person_ckey1 UNIQUE (firstName , lastName , dateOfBirth) ); CREATE TABLE CHEF ( culinaryCerts VARCHAR(300) NOT NULL, competitionEXpr VARCHAR(300) NULL, passportNumber VARCHAR(20) NOT NULL, firstName VARCHAR(30) NOT NULL, lastName VARCHAR(30) NOT NULL, dateOfBirth DATE NOT NULL, CONSTRAINT chef_pkey PRIMARY KEY (passportNumber), CONSTRAINT chef_ckey1 UNIQUE (firstName , lastName , dateOfBirth), CONSTRAINT chef_fkey1 FOREIGN KEY (passportNumber) REFERENCES PERSON (passportNumber) ON DELETE CASCADE, CONSTRAINT chef_fkey2 FOREIGN KEY (firstName , lastName , dateOfBirth) REFERENCES PERSON (firstName , lastName , dateOfBirth) ON DELETE CASCADE );
\n ✓\n\n ✓\n
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.