11、MySQL的级联操作、设计多对多关系的表

文章目录

级联操作

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
*/
-- 所以对于多对多表,通过关系表就建立起了两张表的联系。对于有外键约束的字段,在删除数据时,先删除从表数据,再删除主表数据。

猜你喜欢

转载自blog.csdn.net/ShawnYue_08/article/details/107836133