簡體   English   中英

SQL DDL:具有兩個外鍵的遞歸表(MySQL)

[英]SQL DDL: Recursive table with two foreign keys (MySQL)

我有一個遞歸的subject表,因為一個主題可以是另一個主題的先決條件:

  • 主題沒有先決條件
  • 一個科目可以有1個先決條件
  • 一個科目可以有兩個先決條件

由於存在具有2個先決條件的主題,因此我使prerequisite_1prerequisite_2列FK指向subject_code列:

CREATE TABLE subject(
    subject_code CHAR(7),
    subject_desc VARCHAR(255) NOT NULL,
    no_of_units TINYINT UNSIGNED NOT NULL CHECK(no_of_units >= 0 AND no_of_units < 13),
    prerequisite_1 CHAR(7),
    prerequisite_2 CHAR(7),
    PRIMARY KEY(subject_code),
    FOREIGN KEY(prerequisite_1, prerequisite_2) REFERENCES subject(subject_code)
)ENGINE=INNODB;

我在SQL Fiddle上嘗試了代碼,但未創建表。

如何創建具有1個PK列和2個FK列的遞歸表,這些遞歸表指向該表自己的PK?

不要將先決條件放在subject表中,而應使用多對多關系表:

CREATE TABLE prerequisite (
    subject_code CHAR(7),
    prerequisite CHAR(7),
    PRIMARY KEY (subject_code, prerequisite),
    FOREIGN KEY (subject_code) REFERENCES subject(subject_code),
    FOREIGN KEY (prerequisite) REFERENCES subject(subject_code)
)

這允許任意數量的先決條件。

您需要將它們拆分為兩個單獨的外鍵,並且您可能(但不必)命名它們;

CREATE TABLE subject(
    subject_code CHAR(7),
    subject_desc VARCHAR(255) NOT NULL,
    no_of_units TINYINT UNSIGNED NOT NULL 
       CHECK(no_of_units >= 0 AND no_of_units < 13),
    prerequisite_1 CHAR(7),
    prerequisite_2 CHAR(7),
    PRIMARY KEY(subject_code),
    FOREIGN KEY fk_pr1(prerequisite_1) REFERENCES subject(subject_code),
    FOREIGN KEY fk_pr2(prerequisite_2) REFERENCES subject(subject_code)
) ENGINE=INNODB;

一個SQLfiddle

因此,這是我的意見:

我認為您的語法錯誤,請嘗試將每個外鍵的foreign key內容更改為:

CREATE TABLE subject(
    .........

    CONSTRAINT `subject_ibfk_1` FOREIGN KEY (`prerequisite_1`) REFERENCES `subject` (`subject_code`),

    CONSTRAINT `subject_ibfk_2` FOREIGN KEY (`prerequisite_2`) REFERENCES `subject` (`subject_code`)

)ENGINE=INNODB;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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