簡體   English   中英

如何在作為主鍵和候選鍵的表中引用多個外鍵?

[英]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表中的firstNamelastNamedateOfBirth屬性,因為您可以在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM