[英]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.