目录
概述
-
概念
约束是作用在表中字段的规则
-
目的
保证数据库中数据的正确、有效和完整性
-
分类
约束是作用在表中字段上的,可以再创建表/修改表的时候添加约束
约束演示
请按照一下要求完成数据表结构的创建:
表结构如下:
create table yonghu(
id int primary key auto_increment comment '主键',
name varchar(10) not null unique comment '姓名',
age int check(age>0 && age<=120) comment '年龄',
status varchar(1) default '1' comment '状态',
gender char(1) comment '性别'
) comment '用户';
show tables;
现在我们进行数据的输入:
INSERT INTO yonghu (name, age, status, gender) VALUES
('张三', 25, '1', '男'),
('李四', 30, '1', '女'),
('王五', 45, '1', '男'),
('赵六', 22, '1', '女'),
('孙七', 38, '1', '男'),
('周八', 29, '1', '女'),
('吴九', 50, '1', '男'),
('郑十', 27, '1', '女'),
('钱伯', 42, '1', '男'),
('孔仲', 33, '1', '女');
接着我们来试验一下约束的效果:
INSERT INTO yonghu (name, age, status, gender) VALUES ('孔仲',54, '1', '女');
我们再插入一条信息,名字同样也是 '孔仲' ,但我们发现系统报错了:
因为我们在创建表结构时,将姓名字段约束为唯一值了
INSERT INTO yonghu (name, age, status, gender) value ('小昭', 132, '1', '女');
系统依然报错:
存在check约束函数
当然约束函数在一些软件中实现了可视化操作,下面以GataGrip为例:
在创建表时,可以使用图形化界面添加字段,并且点击相应的选项实现约束函数。
外键约束
概念
使用外键来建立两张表之间的连接,从而保证数据的一致性和完整型性。
举例

其中的字段 deft_id 就是外键

deft_id 建立了员工表与部门表之间的联系,并且将部门表称作父表,员工表称作子表(具有外键的表)。
要注意的是,仅仅这样只是逻辑上这两张表有关联,但是在数据库层面两张表并没有真正的建立关联,并没有保证数据的一致性和完整性。
语法
添加外键
FOREIGN KEY (department_id) REFERENCES departments(department_id)
这句话是在,表结构创建时使用。
alter table departments add constraint link foreign key (department_id) references employees(department_id);
这句是使用在表结构创建之后。
-
代码演示
先创建部门表:
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100) NOT NULL
);
创建员工表:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
contact_info VARCHAR(100),
department_id INT,
/*FOREIGN KEY (department_id) REFERENCES departments(department_id)*/
);
alter table departments add constraint link foreign key (department_id) references employees(department_id);
注意两种外键的关联形式都写上去了
数据输入:
INSERT INTO departments (department_id, department_name) VALUES
(1, '人力资源部'),
(2, '财务部'),
(3, '技术部'),
(4, '市场部'),
(5, '行政部');
INSERT INTO employees (employee_id, contact_info, department_id) VALUES
(101, 'zhangsan@example.com', 1),
(102, 'lisi@example.com', 2),
(103, 'wangwu@example.com', 3),
(104, 'zhaoliu@example.com', 4),
(105, 'sunqi@example.com', 5);
测试
在DataGrip软件中,字段名上带有黄色小钥匙的是主键,刚刚我们以department_id作为外键去建立了两个表之间的关联,字段名前出现蓝色小钥匙,代表外键的意思。
此时如果要删除部门表中的数据时:
它会提示,你无法删除一个父表中的内容
删除外键
ALTER TABLE employees DROP CONSTRAINT link;
即可将外键删除:
不能发现,department_id上的蓝色小钥匙已经不见了,说明外键的关联已经解除了。
此时再进行父表的删除就不会在报错了。
删除/更新行为
CASCADE
alter table employees add constraint fk_emp_dep_id foreign key (department_id) references departments(department_id) on update cascade;
UPDATE CASCADE 使得在修改父表时,系统会自动检查是否有关联的外键,如果有,就会检查并且同时修改外键所在的表中的数据:
上面是修改前的员工表和部门表,然后我现在将部门表中的 人力资源部的对应编号改成6:
那么此时在 UPDATE CASCADE 的约束下,员工表中外键相关联的数据也应该发生变化:
SET NULL
使用SET NULL命令,此时在该约束下,修改了父表之后就会自动检查外键所在的表,与之关联的字段值就会设置为null
将部门表中的人力资源部删除,在更新员工表中的数据,此时:
不难发现,外键字段原先的1,现在被设置为了null