父子表sql问题

时间:2015-06-03 20:42:40

标签: mysql sql database parent-child

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

1 个答案:

答案 0 :(得分:0)

如果学生最多可以有一个 顾问,那么这是一对多的关系。

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

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

此外,一些存储引擎(如InnoDB)支持并强制执行外键。也就是说,我们可以让数据库对可以存储在定义为外键的列中的值强制实施限制(约束)。

例如,我们可以建立一条规则,指出存储在ad_id表中的student列中的值必须才能在行中找到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 

如果advisor表中有引用它的行,这也会强制执行以下规则:student表中的行无法删除。

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

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

如果学生可以与零相关,则一个或多个部分部分可以与零,一个或多个相关 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
)

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

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

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