簡體   English   中英

父子表sql問題

[英]parent child table sql issue

我下面有3個表,其中有許多關系...在學生表中,我有多個外鍵sec_id,ad_id但我不知道如何添加外鍵作為父子關系,請幫幫我。

CREATE TABLE student(
s_id int AUTO_INCREMENT,
name varchar(30) NOT NULL,
PRIMARY KEY(s_id)
)

CREATE TABLE section(
sec_id int AUTO_INCREMENT,
name varchar(2) NOT NULL,
PRIMARY KEY(sec_id)
)


CREATE TABLE advisor(
ad_id int AUTO_INCREMENT,
name varchar(2) NOT NULL,
PRIMARY KEY(ad_id)
)

如果一個學生最多只能有一位 顧問 ,那就是一對多的關系。

實現該關系的正常模式是在子表中定義外鍵列,該表位於關系的“許多”側。 例如:

ALTER TABLE student ADD ad_id INT COMMENT 'fk ref advisor';

此外,某些存儲引擎(例如InnoDB)支持並強制使用外鍵。 也就是說,我們可以讓數據庫對可以存儲在定義為外鍵的列中的值實施限制(約束)。

例如,我們可以建立一條規則,說存儲在student表的ad_id列中的值... 必須advisor表的ad_id列中的一行中找到。

例如:

ALTER TABLE student ADD CONSTRAINT fk_student_advisor 
  FOREIGN KEY (ad_id) REFERENCES advisor(ad_id) 
  ON DELETE RESTRICT ON UPDATE CASCADE 

這也強制執行一個規則,即如果student表中有引用它的行,則不能刪除advisor表中的行。

對於任何一對多關系,都可以重復相同的模式。 例如,如果一個學生可以與最多一個部分 ,我們可以添加以同樣的方式外鍵。

如果存在多對多關系,則我們將引入一個關系表,該表具有引用兩個相關實體表的外鍵。

如果一個學生可以與零個,一個或多個部分相關 ,而一個部分可以與零個,一個或多個學生相關 ,這就是多對多關系的一個示例。

我們可以像這樣引入一個新表(作為示例):

CREATE TABLE student_section 
( student_id  INT NOT NULL COMMENT 'pk, fk ref student'
, section_id  INT NOT NULL COMMENT 'pk, fk ref section'
, PRIMARY KEY (student_id, section_id)
, CONSTRAINT fk_student_section_student
    FOREIGN KEY student_id REFERENCES student(s_id) 
    ON DELETE CASCADE ON UPDATE CASCADE
, CONSTRAINT fk_student_section_section
    FOREIGN KEY section_id REFERENCES section(sec_id) 
    ON DELETE CASCADE ON UPDATE CASCADE
)

有了這個位置,要在學生之間建立關系,我們在新的student_section表中插入一行。 如果該學生與另一部分相關,我們將在表中添加另一行,以引用同一學生,但引用另一部分。

student_id列中存儲的值引用了student表中的一行; section_id列中存儲的值引用section表中的一行。

(多對多關系實際上是由新表中的行組成的,該新表與其他兩個表具有一對多關系。)

暫無
暫無

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

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