gpt4 book ai didi

mysql - 父子表sql问题

转载 作者:行者123 更新时间:2023-11-30 22:42:52 26 4
gpt4 key购买 nike

我下面有 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)
)

最佳答案

如果一个student最多可以有一个 advisor,那么这是一个一对多的关系。

实现该关系的正常模式是在子表中定义一个外键列,该表位于关系的“多”侧。例如:

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 表中的行,则不能将其删除。

可以对任何一对多关系重复相同的模式。例如,如果一个 student 可以与最多一个section相关,我们可以用同样的方式添加一个外键。

如果存在多对多关系,那么我们将引入一个关系表,该表具有引用两个相关实体表的外键。

如果一个student可以与零个、一个或多个section相关,而一个section可以与零个、一个或多个相关student,这是多对多关系的一个例子。

我们可以这样引入一个新表(作为例子):

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
)

有了这个,为了在 studentsection 之间建立关系,我们向新的 student_section 表插入一行。如果 student 与另一个 section 相关,我们会在表中添加另一行,引用同一个学生,但不同的部分。

student_id列中存储的值是指student表中的一行; section_id 列中存储的值引用 section 表中的一行。

(多对多关系实际上是由新表中的行组成的,该新表与其他两个表具有一对多关系。)

关于mysql - 父子表sql问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30630275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com