数据库表约束外键
目录
- 约束
- 数据库设计
- 多表查询
- 事务
约束
- 概念&分类
- 非空约束
- 唯一约束
- 主键约束
- 默认约束
- 检查约束
- 外键约束
约束的概念和分类
- 约束概念
- 约束是作用于表中上的规则,用于限制加入表中的数据
- 约束的存在保证了数据中数据的正确性、有效性和完整性
2.约束的分类
约束名称 | 描述 | 关键字 |
---|---|---|
非空约束 | 保证列中所有数据不能有null值 | NOT NULL |
唯一约束 | 保证列中所有数据各不相同 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空并且唯一 | PRIMARY KEY |
检查约束 | 保证列中所有数据不能有null值 | CHECK |
默认约束 | 保存数据时,未指定值则采用默认值 | DEFAULT |
外键约束 | 外键用来让两个表的数据建立链接,保证数据的一致性和完整性 | FOREIGN KEY |
Tips: MySQL不支持检查约束
非空约束
- 概念
- 非空约束用于保证列中所有的数据不能有null值
- 语法
(1)添加约束
-- 创建表时添加非空约束
CREATE TABLE 表名(
列名 数据类型 NOT NULL,
...
);
-- 建完表后添加非空约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
(2) 删除约束
ALTER TABLE 表名 MODIFY 字段名 数据类型;
唯一约束
- 概念
- 唯一约束用于保证列中所有数据各不相同
- 语法
(1) 添加约束
-- 创建表时添加唯一约束
create table 表名(
列名 数据类型 UNIQUE [AUTO_INCREMENT],
-- AUTO_INCREMENT: 当不指定值时自动增长
...
)
-- 建完表后添加唯一约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;
(2) 删除约束
ALTER TABLE 表名 DROP INDEX 字段名;
主键约束
- 概念
- 主键是一行数据的唯一标识,要求非空并且唯一
- 一张表只能有一个主键
- 语法
(1) 添加约束
-- 创建表时添加主键约束
create table 表名(
列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],
...
);
create table 表名(
列名 数据类型,
[CONSTRAINT] [约束名称] PRIMARY KEY [AUTO_INCREMENT] (列名),
...
);
-- 建完表后添加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
(2) 删除约束
ALTER TABLE 表名 PRIMARY KEY;
默认约束
- 概念
- 保存数据时,未指定值则采用默认值
- 语法
(1) 添加约束
-- 创建表时添加默认约束
create table 表名(
列名 数据类型 DEFAULT 默认值,
...
);
-- 建完表后添加默认约束
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
(2) 删除约束
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
外键约束
- 概念
- 外键用来让两个表的数据建立连接,保证数据的一致性和完整性
/*
外键约束:
* 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
-- 创建表时添加外键约束
CREATE TABLE 表名(
列名 数据类型,
…
[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
);
-- 建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
-- 删除约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
*/
-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS 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 表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);
-- 添加 2 个部门
insert into dept(dep_name,addr) values
('研发部','广州'),('销售部', '深圳');
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (NAME, age, dep_id) VALUES
('张三', 20, NULL);
('李四', 20, 1),
('王五', 20, 1),
('赵六', 20, 2),
('孙七', 22, 2),
('周八', 18, 2);
-- ------------------
select * from emp;
select * from dept;
-- 删除外键
alter table emp drop FOREIGN key fk_emp_dept;
-- 建完表后,添加外键
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);
======================
约束练习
DROP TABLE IF EXISTS emp;
-- 员工表
CREATE TABLE emp(
id INT PRIMARY KEY auto_increment, -- 员工主键id, 主键且自增长
ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
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,bonus) values(null,'张三','1999-11-11',8800,5000);
INSERT INTO emp(id,ename,joindate,salary,bonus) values(1,'张三','1999-11-11',8800,5000);
INSERT INTO emp(id,ename,joindate,salary,bonus) values(2,'李四','1999-11-11',8800,5000);
-- 演示非空约束
INSERT INTO emp(id,ename,joindate,salary,bonus) values(3,null,'1999-11-11',8800,5000);
-- 演示唯一约束
INSERT INTO emp(id,ename,joindate,salary,bonus) values(3,'李四','1999-11-11',8800,5000);
-- 演示默认约束
INSERT INTO emp(id,ename,joindate,salary) values(3,'王五','1999-11-11',8800);
INSERT INTO emp(id,ename,joindate,salary,bonus) values(4,'赵六','1999-11-11',8800,null);
-- 演示自动增长:auto_increment: 当列是数字类型并且 唯一约束
INSERT INTO emp(ename,joindate,salary,bonus) values('赵六','1999-11-11',8800,null);
INSERT INTO emp(id,ename,joindate,salary,bonus) values(null,'赵六2','1999-11-11',8800,null);
SELECT * FROM emp;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏