约束
概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
(一组数据必须有值,比如必须有名字,不然表格不完整)
分类:
- 主键约束:primary key
- 非空约束:not null
- 唯一约束:unique
- 外键约束:foreign key
1、主键约束
含义:非空且唯一
一张表只能有一个字段为主键
主键就是表中记录的唯一标识
- 创建表时,添加主键约束
CREATE TABLE stu(
id INT PRIMARY KEY, -- 给id添加主键约束
NAME VARCHAR(20)
);
- 删除主键
ALTER TABLE stu DROP PRIMARY KEY;
- 创建完表之后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
- 自动增长
- 概念:如果某一列是数值类型的,使用关键字 auto_increment 可以来完成值的自动增长。
CREATE TABLE stu(
id INT PRIMARY KEY AUTO_INCREMENT, -- 给id添加主键约束
NAME VARCHAR(20)
);
-- 表格里已经有1|aaa ,2|bbb
SELECT * FROM stu;
-- 这里把id置为NULL,主键一般会报错,但是加了AUTO_INCREMENT,就可以自动生成3执行下面这段代码多次,数字也会逐渐增加。3|ccc,4|ccc,5|ccc...,如果我加一条语句INSERT INTO stu VALUES(10,'ccc'),运行之后,添加了10|ccc。再运行一遍下面这条语句,那么结果将会变成11|ccc。会读取上一条记录的值,然后自动增长。
INSERT INTO stu VALUES(NULL,'ccc');
- 删除自动增长
ALTER TABLE stu MODIFY id INT;
-- 主键仍然存在
- 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
2、非空约束
- 重新建一个表,在设定数据时加入代码not null
CREATE TABLE teacher(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);
在添加数据时把name置空就会报错,如下图
- 删除name非空约束
ALTER TABLE teacher MODIFY NAME VARCHAR(20);
- 创建表后,再添加非空约束
ALTER TABLE teacher MODIFY NAME VARCHAR(20) NOT NULL;
3、唯一约束
- 创建表时添加唯一约束
CREATE TABLE teacher(
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
);
不能与其他编号相同,不可以有重复的数字。但是都为null不会报错,可以有多个null。
- 删除唯一约束
ALTER TABLE teacher DROP INDEX phone_number;
-- 与上面不相同,较为特殊,使用了drop index
- 创建表后添加唯一约束
ALTER TABLE teacher MODIFY phone_number VARCHAR(20) UNIQUE;
4、外键约束
- 创建表
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30),
age INT,
dep_name VARCHAR(30), -- 部门名称
dep_location VARCHAR(30) -- 部门地址
);
id | NMAE | age | dep_name | dep_location |
---|---|---|---|---|
1 | 张三 | 20 | 研发部 | 广州 |
2 | 李四 | 21 | 研发部 | 广州 |
3 | 王五 | 20 | 研发部 | 广州 |
4 | 老王 | 20 | 销售部 | 深圳 |
5 | 大王 | 22 | 销售部 | 深圳 |
6 | 小王 | 18 | 销售部 | 深圳 |
出现了数据冗余的现象
- 那么解决方案就是创建两张表然后把dep_name,dep_location,作为两列
id | dep_name | dep_location |
---|---|---|
1 | 研发部 | 广州 |
2 | 销售部 | 深圳 |
外键要关联另一张表的主键,让表与表产生关系,从而保证数据的正确性。
- 外键约束
- 创建表时,可以添加外键
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20), -- 部门名称
dep_location VARCHAR(20) -- 部门地址
);
CREATE TABLE employment(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT, -- 外键对应主表的键
CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id)
-- CONSTRAINT 外键名称 FOREIGN KEY(外键 列名称) REFERENCES 主表名称(主表 列名称)
);
ps:有外键关联之后不可以随便将department表中的行数据删掉,而且也不可以在employment中添加不存在的部门编号,例如3。可以为null
- 删除外键
ALTER TABLE employment DROP FORIGN KEY emp_dept_fk;
-- ALTER TABLE 表名 DROP FORIGN KEY 外键名称;
- 创建表之后,添加外键
ALTER TABLE employment ADD FORIGN KEY emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id);
-- ALTER TABLE 表名 ADD FORIGN KEY 外键名称 FOREIGN KEY(外键字段名称) REFERENCES 主表名称(主表 列名称);
- 级联操作
作用就是当我改变不论是主表还是副表的id值,把department里的id值由1改成5,或者把employment主表中的外键对应的列dep_id由1改成5,只要是关联的数据就会跟着改变。
- 级联更新:
-- 添加外键,设置级联更新
ALTER TABLE employment ADD CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id) ON UPDATE CASCADE;
-- 改变employment中的dep_id的值由1改成5
UPDATE employment SET dep_id = NULL WHERE dep_id = 1;
UPDATE employment SET dep_id = 5 WHERE dep_id IS NULL;
- 级联删除:
-- 添加外键,设置级联更新级联删除
ALTER TABLE employment ADD CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE;
-- 把一号部门删掉,那么主表的员工也会被删掉,用上面的例子就是说删了销售部那一行,那么老王,大王,小王这三个员工都会被删掉