mysql级联删除
场景:
员工表
id
:员工idleader_id
:该员工的领导的id(也是员工id) ——外键dept_id
:该员工的部门id(部门表外键) ——外键employee_name
创建部门表
CREATE TABLE IF NOT EXISTS department (
id INT PRIMARY KEY,
dept_name VARCHAR(20)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
插入数据
INSERT INTO department (id, dept_name) VALUES (1, '研发部');
INSERT INTO department (id, dept_name) VALUES (2, '营销部');
INSERT INTO department (id, dept_name) VALUES (3, '售后部');
创建员工表
CREATE TABLE employee (
id INT PRIMARY KEY,
employee_name VARCHAR(20),
dept_id INT,
leader_id INT
)
ALTER TABLE employee
ADD CONSTRAINT fk_employee_department FOREIGN KEY (dept_id) REFERENCES department(id)
ON UPDATE CASCADE;
ALTER TABLE employee
ADD CONSTRAINT fk_employee_employee FOREIGN KEY (leader_id) REFERENCES employee(id)
ON DELETE CASCADE;
查看索引的语句 SHOW INDEX FROM employee
INSERT INTO employee (id, employee_name, dept_id) VALUES(2, 'John', 1);
INSERT INTO employee (id, employee_name, dept_id) VALUES(3, 'Rose', 3);
INSERT INTO employee (id, employee_name, dept_id) VALUES(4, 'Jenny', 2);
INSERT INTO employee (id, employee_name, dept_id) VALUES(5, 'Cris', 2);
INSERT INTO employee (id, employee_name, dept_id) VALUES(7, 'Jack', 1);
INSERT INTO employee (id, employee_name, dept_id) VALUES(9, 'Fish', 3);
INSERT INTO employee (id, employee_name, dept_id) VALUES(6, 'Summer', 1);
UPDATE employee SET leader_id=4 WHERE id=2;
UPDATE employee SET leader_id=4 WHERE id=3;
UPDATE employee SET leader_id=3 WHERE id=4;
UPDATE employee SET leader_id=2 WHERE id=5;
UPDATE employee SET leader_id=2 WHERE id=7;
UPDATE employee SET leader_id=5 WHERE id=9;
UPDATE employee SET leader_id=4 WHERE id=6;
DELETE FROM employee WHERE id=2;
结果
假如主键和外键串联起来呢?
INSERT INTO employee (id, employee_name, dept_id) VALUES(8, 'Summer2', 1);
INSERT INTO employee (id, employee_name, dept_id) VALUES(10, 'Summer3', 1);
UPDATE employee SET leader_id=9 WHERE id=8;
UPDATE employee SET leader_id=8 WHERE id=10;
删除员工id为2的员工
结果
为什么要级联操作?
- 如果要修改外键的值,修改时十分麻烦:需要先将引用的外键
- 级联更新:【例】我将部门的id更新后,员工表中部门外键也一同更新
- 如果要研发部门和其部下的员工,需要先删除部门下的所有员工,再将该部门删除
- 级联删除:【例】属于研发部门和其部下的员工全删除,只需要在外键表中删除外键数据即可,关联的表中的数据一并删除
CREATE TABLE 表名 (
...
外键列
CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称)
);
CREATE TABLE IF NOT EXISTS stuinfo (
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
gender CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
ALTER TABLE ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称
FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称)
ON UPDATE CASCADE
ON DELETE CASCADE;
1. 级联更新:ON UPDATE CASCADE
2. 级联删除:ON DELETE CASCADE
【注】mysql 列名不用驼峰。
因为数据库字段、索引对大小写是不敏感的,驼峰标识无意义;
所以一般采用数据库字段下划线, 实体类驼峰的命名方式
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)