【问题标题】:Create foreign key that references to composite key创建引用复合键的外键
【发布时间】:2021-01-02 22:04:21
【问题描述】:
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 行
无法创建约束或索引。查看以前的错误

【问题讨论】:

  • 使用分号结束语句
  • Thesis 有一个指向 Supervisor 的 FK,但 Supervisor 中的 PK 有两列 - 如果您想用 FK 引用它,您必须提供子表中的两列也是如此。您可以仅引用 PK 的一部分 - 全部(其中的每一列),或者您不能引用它。
  • 我试过这个:外键 (SupervisorID) REFERENCES Supervisor(SupervisorID , PersonID) 但这不起作用。发生错误。 @marc_s
  • 外键端也需要是两列。然而,在这种情况下,将Supervisor 设为主键和外键(到Person)的单列会更容易

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


【解决方案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 表。

【讨论】:

  • 我有作业,一些规则是: 2. 一个人可以是多个论文的作者(例如,一个人可以准备一篇硕士论文,以后他/她可以准备博士论文),3. 一篇论文只能有一位作者(与科学论文不同,论文中没有共同作者),4. 一篇论文必须至少有一位导师,5. 一篇论文最多可以有两位导师(一位主管和一个共同主管),6. 一个人可以监督很多论文所以,我认为创建 2 个主管时我使用了复合键,但我认为这是错误的。我该怎么办..
  • 您不需要单独的作者或主管表。
  • 你说我只需要创建一个person表?如果我这样做,为了显示关系,我需要图表中的 2 个关系连接对吗?(在论文和人之间)。
  • @vikbaris 仅当论文可以有未定义数量的导师时。在我们的例子中,您只需在 Thesis 上创建两列:SupervisorCo-supervisor,尽管如果您根本可能有更多,那么我会像您一样制作一个连接表说。
  • Thiesis :Supervisor Co-Supervisor(可选,可以为空)和Author 这些创建自Person
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2021-02-01
  • 1970-01-01
相关资源
最近更新 更多