约束:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
如果给表中添加了一条数据,年龄字段有值, 而姓名字段无值,这样的数据不太好,所以要对数据库表做约束。
分类:
1.主键约束:primary key
1.注意:
1.含义:非空且唯一。
2.一张表只能有一个字段为主键。
3.主键就是表中记录的唯一标识。
4.自动增长:
概念:如果某一列是数值类型的,使用auto_increment可以完成值得自动增长。
CREATE TABLE stu3 (
id INT PRIMARY KEY AUTO_INCREMENT, -- 给id添加主键约束
NAME VARCHAR(20)
)
-- 删除自动增长
ALTER TABLE stu MODIFY id INT;
-- 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
CREATE TABLE stu1(
id INT PRIMARY KEY, -- 给id添加主键约束
NAME VARCHAR(20)
)
-- 删除主键
-- alter table stu1 modify id int; // 错的
ALTER TABLE stu1 DROP PRIMARY KEY;
-- 创建完表后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
SELECT * FROM stu1;
2.非空约束:not null
-- 创建表添加非空约束
CREATE TABLE yueshu (
id INT, -- 编号
NAME VARCHAR(20) NOT NULL -- name 为非空
);
-- 删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
-- 创建表完成后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
SELECT * FROM stu;
3.唯一约束:unique (那一列的数据不能有重复,比如说电话号码等)
CREATE TABLE stu (
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
);
-- 注意mysql中,唯一约束限定的列的值可以有多个null
-- 删除唯一约束
-- ALTER TABLE stu MODIFY phone_number VARCHAR(20); // 没用
ALTER TABLE stu DROP INDEX phone_number;
-- 在创建表后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
4.外键约束:foreign key 让表与表产生关系,从而保证数据的正确性。
1.在创建表时,可以添加外键。
*语法:
create table 表名(
...
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
)
新建两张表:
部门表:
人员表:
比如说现在需要撤销广州的研发部,但是人员表里面的前三个人信息就是归属于研发部的,这样数据就不符合逻辑了。
如下给员工表添加外键。可以保证部门可以不被随意删除。
-- 解决方案:分成 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_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id)
);
删除外键:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;
添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES department(主列表名称);
-- 添加外键
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id);
约束级联操作
需求:想改某个部门的id,则其他关联这个id的数据也要变化才行,否则就有歧义。
笨办法:
1.现将关联数据的部门字段变为null (UPDATE employee SET dep_id = NULL WHERE dep_id = 1;)
2.手动将部门表的id修改掉:
3.再将员工表dep_id为null的变为5
UPDATE employee SET dep_id = 5 WHERE dep_id IS NULL;
上面这个笨办法太麻烦了,想着修改部门id,则关联的数据会跟着变化。
可以添加外键过程中设置级联更新 就是部门id变了 员工的部门id也会跟着变
-- 添加外键,并设置级联更新
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE;
可以添加外键过程中设置级联更新 就是部门id变了 员工的部门id也会跟着变,删除了部门,则员工也会跟着删除
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE;
这种级联删除的操作其实有利有弊。