MySQL - 外键

2020/07/18

我们先创建两张表,父表t_class,子表t_student

其中,父表包含班级编号cid、班级名称cname两个字段,且cid为主键。

子表包含学生编号sid、学生姓名sname、班级编号cid三个字段,

其中sid为主键,cid为外键。

CREATE TABLE IF NOT EXISTS t_class(
    cid   INT(10)     AUTO_INCREMENT,
    cname VARCHAR(50) NOT NULL,
    PRIMARY KEY(cid)
);

CREATE TABLE IF NOT EXISTS t_student(
    sid    INT(10)     AUTO_INCREMENT,
    sname  VARCHAR(50) NOT NULL,
    cid    INT(10),
    PRIMARY KEY(sid),
    FOREIGN KEY(cid) REFERENCES t_class(cid)
);


INSERT INTO t_class(cname) VALUES('高一(1)班');
INSERT INTO t_class(cname) VALUES('高一(2)班');
INSERT INTO t_class(cname) VALUES('高一(3)班');

INSERT INTO t_student(sname, cid) VALUES('张三', 2);
INSERT INTO t_student(sname, cid) VALUES('李四', 1);
INSERT INTO t_student(sname, cid) VALUES('王五', 3);

主要注意以下三点:

第一,外键字段去引用一张表中的某个字段时,该字段必须具有唯一性

也就说,父表中的cid字段一定要保证唯一性。

第二,外键值可以为null

INSERT INTO t_student(sname, cid) VALUES('yyc', null);

举个例子:

第三,父子表的创建、插入、删除顺序。

假设父表是t_class,子表是t_student

  • 先创父表,再创子表。

也就是先创建t_class表,然后创建t_student表,因为后者的cid字段依赖于前者。

  • 先插入父表,再插入子表。

t_student插入一条cid为非空的数据之前,必须要将对应cid数据插入到t_class表中。

  • 先删除子表中的相关数据,再删除父表中的数据。

举个例子:

-- Cannot delete or update a parent row: 
-- a foreign key constraint fails (`test`.`t_student`, CONSTRAINT `t_student_ibfk_1` 
-- FOREIGN KEY (`cid`) REFERENCES `t_class` (`cid`))
DELETE FROM t_class WHERE cid = 2;


一位喜欢提问、尝试的程序员

(转载本站文章请注明作者和出处 姚屹晨-yaoyichen

Post Directory