MySQL--约束、级联

约束、级联

-- 约束

CREATE TABLE sto(
	id INT,
	NAME VARCHAR(20) NOT NULL -- name 非空
);

-- 删除name的非空约束
ALTER TABLE sto MODIFY NAME VARCHAR(20);

-- 创建完表后,添加非空约束
ALTER TABLE sto MODIFY NAME VARCHAR(20) NOT NULL;

SELECT * FROM sto;


-- 唯一约束
CREATE TABLE sto(
	id INT,
	tel VARCHAR(20) UNIQUE -- name 非空
);

-- 语句删除唯一约束
ALTER TABLE sto DROP INDEX tel;

-- 语句添加约束
ALTER TABLE sto MODIFY tel VARCHAR(20) UNIQUE;



-- 主键约束

CREATE TABLE sto(
	id INT PRIMARY KEY,
	tel VARCHAR(20) UNIQUE -- name 非空
);

-- 删除主键
ALTER TABLE sto DROP PRIMARY KEY;

-- 表创建完后,添加主键
ALTER TABLE sto MODIFY id INT PRIMARY KEY;

-- 自动增长
CREATE TABLE sto(
	id INT PRIMARY KEY AUTO_INCREMENT, -- 自动增长
	tel VARCHAR(20) UNIQUE -- name 非空
);

-- 删除自动增长
ALTER TABLE sto MODIFY id INT;

-- 添加自动增长
ALTER TABLE sto MODIFY id INT AUTO_INCREMENT; 




-- 外键约束

CREATE TABLE emp (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	dep_name VARCHAR(30),
	dep_location VARCHAR(30)
);
-- 添加数据
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');

select * from emp;

-- 数据有冗余
-- 解决方案:分成 2 张表



-- 创建部门表(id,dep_name,dep_location)
-- 一方,主表
create table department(
	id int primary key auto_increment,
	dep_name varchar(20),
	dep_location varchar(20)
);

-- 创建员工表(id,name,age,dep_id)
-- 多方,从表
create table employee(
	id int primary key auto_increment,
	name varchar(20),
	age int,
	dep_id int, -- 外键对应主表的主键
	constraint emp_dep_id foreign key (dep_id) references department(id)
);
-- 添加 2 个部门
insert into department values(null, '研发部','广州'),(null, '销售部', '深圳');

select * from department;

-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);

select * from employee;


drop table emp;
drop table department;
drop table employee;


-- 添加外键
alter table employee add constraint emp_dep_id foreign key (dep_id) references department(id);

-- 删除外键
alter table employee drop foreign key emp_dep_id;

添加级联

-- 约束
-- 级联   更新和删除

-- 要修改department的id 先要把 employee里面有关部门的id 置为null
UPDATE employee SET dep_id = NULL WHERE dep_id = 1; 

SELECT * FROM employee;

-- 修改department的id
UPDATE department SET id = 5 WHERE id = 1;

SELECT * FROM department;

-- 然后修改employee中的id
UPDATE employee SET dep_id = 5 WHERE dep_id IS NULL;

-- 这样很麻烦,所以产生了级联操作,修改一方的数据,另一方自动替换。
-- 需要在设置外键的时候,设置级联




-- 添加外键,并设置级联
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE;

-- 修改部门编号id, 目标是employee 中部门编号为5的自动变成1
UPDATE department SET id = 1 WHERE id = 5;

-- 级联更新成功





-- 级联删除
-- 可以放在一起,也可以分开写。
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE;
















你可能感兴趣的:(MySQL)