创建引用复合键的外键

问题描述

CREATE TABLE Person
(
    PersonID int NOT NULL IDENTITY,PersonName nvarchar(30) NOT NULL,PersonSurname nvarchar(30) NOT NULL,PRIMARY KEY (PersonID)
)

CREATE TABLE Author
(
    AuthorID int NOT NULL IDENTITY,PersonID int NOT NULL,PRIMARY KEY (AuthorID),FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
)

CREATE TABLE Supervisor 
(
    SupervisorID int NOT NULL,PRIMARY KEY (SupervisorID,PersonID),FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
)

CREATE TABLE University
(
    UniversityID int NOT NULL IDENTITY,UniversityName nvarchar(100) NOT NULL,PRIMARY KEY (UniversityID)
)

CREATE TABLE Enstitute
(
    EnstituteID int NOT NULL IDENTITY,UniversityID int NOT NULL,EnstituteName nvarchar(100),PRIMARY KEY (EnstituteID),FOREIGN KEY (UniversityID) REFERENCES University(UniversityID)
)

CREATE TABLE Thesis 
(
    ThesisNo numeric(8,0) NOT NULL IDENTITY,AuthorID int NOT NULL,EnstituteID int NOT NULL,SupervisorID int NOT NULL,Title nvarchar(100)NOT NULL,Abstract nvarchar(500)NOT NULL,Pages int NOT NULL,SubmitDate datetime NOT NULL,[Type] nchar(30) NOT NULL,[Language] nchar(20) NOT NULL
    PRIMARY KEY (ThesisNo),FOREIGN KEY (EnstituteID) REFERENCES Enstitute(EnstituteID),FOREIGN KEY (AuthorID) REFERENCES Author(AuthorID),FOREIGN KEY (SupervisorID) REFERENCES Supervisor(SupervisorID)
)

CREATE TABLE Keywords
(
    ThesisNo numeric(8,0) NOT NULL,Keyword nvarchar(50) NULL,FOREIGN KEY (ThesisNo) REFERENCES Thesis(ThesisNo)
)

CREATE TABLE Subjects
(
    SubjectID int NOT NULL,ThesisNo numeric(8,[Subject] nvarchar(120) NOT NULL,PRIMARY KEY (SubjectID),FOREIGN KEY (ThesisNo) REFERENCES Thesis(ThesisNo) 
)

我收到此错误

消息 1767,级别 16,状态 0,第 38 行
外键 'FK__Thesis__AuthorID__47DBAE45' 引用了无效的表 'Author'。

消息 1750,级别 16,状态 1,第 38 行
无法创建约束或索引。查看以前的错误

this is part of the diagram I want to do.

解决方法

为什么Supervisor有一个复合键。它看起来像 Person 的子类型,应该共享相同的密钥结构。例如

CREATE TABLE Supervisor 
(
    PersonID int NOT NULL,PRIMARY KEY (PersonID),FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
)

也是作者

CREATE TABLE Author
(
    PersonID int NOT NULL,PRIMARY KEY (PersonID ),FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
)

虽然通常只有一个 Person 表更好。