创建引用复合键的外键

时间:2021-01-02 22:04:21

标签: sql-server database foreign-keys composite-primary-key composite-key

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 ,
    PersonID 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,0) NOT NULL,
    [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.

1 个答案:

答案 0 :(得分:1)

为什么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 表更好。