级联操作
ON DELETE CASCADE ON UPDATE CASCADE
-- 级联操作
USE studb;
CREATE TABLE IF NOT EXISTS person(
id VARCHAR(10) NOT NULL,
NAME VARCHAR(20) NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE IF NOT EXISTS orders(
uid INT UNSIGNED NOT NULL,
uname VARCHAR(20) NOT NULL,
sid VARCHAR(10) NOT NULL,
PRIMARY KEY(uid),
CONSTRAINT fk_orders_person FOREIGN KEY(sid) REFERENCES person(id) ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO person VALUES('zs','张三'),('ls','李四');
INSERT INTO orders VALUES
(1,'手机','zs'),(2,'电脑','zs'),(3,'耳机','ls'),(4,'ipad','ls');
# 级联更新
UPDATE person
SET id = 'zhs'
WHERE id = 'zs';
SELECT * FROM orders;
/*
uid uname sid
1 手机 zhs
2 电脑 zhs
3 耳机 ls
4 ipad ls
*/
# 级联删除
DELETE FROM person WHERE id = 'ls';
SELECT * FROM orders;
/*
uid uname sid
1 手机 zhs
2 电脑 zhs
*/
设计表
-- 多对多(引入一张中间表,把多对多关系分为两个一对多关系,然后在多表中添加外键约束)
/*
一对一关系:身份证号和姓名
一对多关系:学生和班级的关系,只需在学生表中添加班级id的外键
多对多的关系:学生和课程的关系,一个学生选多门课,一门课也可以被多个学生选
在多对多的关系中,添加一个字段就不能解决问题了。而是需要引入一张关系表(中间表)
*/
CREATE TABLE IF NOT EXISTS student(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(10) NOT NULL,
age INT NOT NULL,
gender ENUM('男','女'),
PRIMARY KEY(id)
);
INSERT INTO student VALUES
(NULL,'张三',23,'男'),
(NULL,'李四',24,'男'),
(NULL,'王五',25,'男');
CREATE TABLE IF NOT EXISTS course(
id INT NOT NULL AUTO_INCREMENT,
course_name VARCHAR(20) NOT NULL,
PRIMARY KEY(id)
);
INSERT INTO course VALUES
(NULL,'Java'),
(NULL,'C++'),
(NULL,'Python');
# 此时,student表中的id字段和course表中的id字段就属于多对多的关系
CREATE TABLE IF NOT EXISTS stu_cou(
id INT NOT NULL AUTO_INCREMENT,
student_id INT NOT NULL,
course_id INT NOT NULL,
PRIMARY KEY(id),
CONSTRAINT fk_stu_cou_student FOREIGN KEY(student_id) REFERENCES student(id),
CONSTRAINT fk_stu_cou_course FOREIGN KEY(course_id) REFERENCES course(id)
);
INSERT INTO stu_cou VALUES
(NULL,1,1),(NULL,1,2),(NULL,2,1),(NULL,2,3),(NULL,3,1),(NULL,3,2);
SELECT * FROM stu_cou;
/*
id student_id course_id
1 1 1
2 1 2
3 2 1
4 2 3
5 3 1
6 3 2
*/
-- 所以对于多对多表,通过关系表就建立起了两张表的联系。对于有外键约束的字段,在删除数据时,先删除从表数据,再删除主表数据。