mysql(4)--数据库约束
约束
概念和分类
概念
- 约束是作用域表中列上的规则,用于限制加入表的数据
- 约束的存在保证了数据库中数据的正确性,有效性和完整性
约束的分类
约束名称 | 描述 | 关键字 |
---|---|---|
非空约束 | 保证列中所有数据不能有null值 | NOT NULL |
唯一约束 | 保证列中所有数据各不相同 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
检查约束 | 保证列中的值满足某一个条件 | CHECK |
默认约束 | 保存数据时,未指定值则采用默认值 | DEFAULT |
外键约束 | 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性 | FOREIGN KEY |
mysql不支持检查约束
自增长主键需要在primary key后面添加上auto_increment
约束和案例
约束的使用
在创建表的语句中,在类型后添加约束的名称即可,但是如果要使用自增长,首先要确保自增长的键是数字类型,其次在创建的语句里要添加上auto_increment,并且该键要是唯一约束
非空约束
添加约束
- 在创建表的时候添加约束
create table 表名(
列名 数据类型 not null,
...
);
- 创建完表后添加
alter table 表名 modify 字段名 数据类型 not null;
删除约束
alter table 表名 modify 字段名 数据类型;
唯一约束
添加约束
- 在创建表的时候添加约束
create table 表名(
列名 数据类型 unique[auto_increment],
...
);
create table 表名(
列名 数据类型,
...
[constraint] [约束名称] unique(列名)
);
- 创建完表后添加
alter table 表名 modify 字段名 数据类型 unique;
删除约束
alter table 表名 drop index 字段名;
主键约束
添加约束
- 在创建表的时候添加约束
create table 表名(
列名 数据类型 primary key[auto_increment],
...
);
create table 表名(
列名 数据类型,
...
[constraint] [约束名称] primary key(列名)
);
- 创建完表后添加
alter table 表名 add primary key(字段名);
删除约束
alter table 表名 drop primary key;
默认约束
添加约束
- 在创建表的时候添加约束
create table 表名(
列名 数据类型 default 默认值,
...
);
- 创建完表后添加
alter table 表名 alter 列名 set default 默认值;
删除约束
alter table 表名 alter 列名 drop default;
案例
create table emp(
id int primary key auto_increment,-- 主键且自增长
ename varchar(50) not null,-- 姓名,非空
joindate date not null,-- 入职日期,非空
salary double(7,2) not null,-- 工资,非空
bonus double(7,2) DEFAULT 0 -- 奖金,没有的话默认为0
);
insert into emp(id,ename,joindate,salary,bonus) values(1,'张三','1999-11-11',8800,5000);
insert into emp(id,ename,joindate,salary) values(2,'李四','1999-11-11',8800);
insert into emp(ename,joindate,salary,bonus) values('王五','1999-1-12',9900,4500);
insert into emp(ename,joindate,salary,bonus) values('赵六','2011-12-12',11000,4000);
select * from emp;
+----+-------+------------+----------+---------+
| id | ename | joindate | salary | bonus |
+----+-------+------------+----------+---------+
| 1 | 张三 | 1999-11-11 | 8800.00 | 5000.00 |
| 2 | 李四 | 1999-11-11 | 8800.00 | 0.00 |
| 3 | 王五 | 1999-01-12 | 9900.00 | 4500.00 |
| 4 | 赵六 | 2011-12-12 | 11000.00 | 4000.00 |
+----+-------+------------+----------+---------+
4 rows in set (0.02 sec)
外键约束
概念
外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性.
语法
- 创建表时添加外键约束
create table 表名(
列名 数据类型,
...
[constraint] [外键名称] foreign key(外键列名) references 主表(主表列名)
);
注:外键名称是给自己设置的外键起的名字,对原表的列名没有影响,作为标注,可以用fk_表1_表2来表示两个表的关联关系
- 建完表后添加外键约束
alter table 表名 add constraint 外键名称 foreign key(外键字段名称) references 主表名称(主表列名称);
- 删除约束
alter table 表名 drop foreign key 外键名称;
案例
在部门中删去某一个部门后,如果原先没有构成外键约束,部门的消失对emp表格中的dep_id不会产生影响。
由于是emp员工表中的dep_id与dept表的id相关联,所以emp员工表是从表,dept部门表是主表
创建相关信息
create table dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键 dep_id , 关联 dept 表的di主键
constraint fk_emp_dept foreign key(dep_id) references dept(id)
);
insert into dept(id,dep_name,addr) values(1,'研发部','广州');
insert into dept(id,dep_name,addr) values(2,'销售部','深圳');
insert into emp(name,age,dep_id) values('张三',20,1);
insert into emp(name,age,dep_id) values('李四',20,1);
insert into emp(name,age,dep_id) values('王五',20,1);
insert into emp(name,age,dep_id) values('赵六',20,2);
insert into emp(name,age,dep_id) values('孙七',22,2);
insert into emp(name,age,dep_id) values('周八',18,2);
注:由于添加了外键后两个表是有从属关系的,比如在这里emp是从表,而dept是主表,所以必须先创建dept,先插入dept,才能对emp表进行创建和数据的插入;另外删除也保证以一定的规则,删除的时候,先删除从表里的元素,才能删除主表的对应元素
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏