MySQL数据库——表的约束(非空约束、唯一约束、主键约束、外键约束)
目录
1 表的约束
约束,是对表中的数据进行限定,保证数据的正确性、有效性和完整性,约束分为以下几类:
- 主键约束:primary key
- 非空约束:not null
- 唯一约束:unique
- 外键约束:foreign key
1.1 非空约束:not null
1)在创建表时添加约束:
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);
2)创建表后再添加非空约束:
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
3)删除name的非空约束:
ALTER TABLE stu MODIFY NAME VARCHAR(20)
1.2 唯一约束:unique,值不能重复
1)创建表时添加唯一约束:
CREATE TABLE stu(
id INT,
number VARCHAR(20) UNIQUE
);
注意:MySQL中唯一约束限定的列的值可以有多个null
2)删除唯一约束:
-- alter table stu modify number varchar(20); 不同于非空约束的删除方法
ALTER TABLE stu DROP INDEX number;
3)创建表后添加唯一约束:
ALTER TABLE stu MODIFY number VARCHAR(20) UNIQUE;
1.3 主键约束:primary key
1)注意:
- 若某一列添加了该约束,则代表了非空,且唯一;
- 一张表只能有一个字段为主键;
- 主键就是表中记录的唯一标识;
2)创建表时添加主键约束
CREATE TABLE stu(
id INT PRIMARY KEY,
number VARCHAR(20)
);
3)删除主键
-- 错误方式 ALTER TABLE stu MODIFY id int;
ALTER TABLE stu DROP PRIMARY KEY;
4)创建完表后添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
5)自动增长:若某一列是数值类型的,使用关键字auto_increment 可以来完成值得自动增长。
- 在创建 表时添加主键约束,且完成主键自增长
CREATE TABLE stu(
id INT PRIMARY KEY AUTO_INCREMENT,
number VARCHAR(20)
);
- 删除自动增长
ALTER TABLE stu MODIFY id INT;
- 创建后,添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
1.4 外键约束:foreign key
【引例】我们创建一张职工表如下,但是发现存在明显的缺陷:
- 数据冗余;
- 后期还会出现增删改的问题;
所以,基于以上问题,我们可以通过拆表解决,一张员工表,一张部门表,员工表中的dep_id 对应部门表中的id
以上仍然存在一个问题,当在员工表中输入不存的部门时,数据依然可以添加,不符合实际,因此,这里就可以通过使用外键约束来解决。
【概念】什么是外键约束?
外键,就是从表中与主表主键对应的那一列,如:员工表中的dep_id,其中,主表是一方,用来约束别人的表,从表可以是多方,被别人约束的表。
注意:外键可以为NULL,但是不能是不存在的外键值。
1)创建表时添加外键
语法: create table 表名( ... 外键列 constraint 外键名称 foreign key (外键列名称) references 主表名称(主表主键名称) );
-- 创建部门表(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_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id)
); -- 外键对应主表的主键
-- 添加2个部门
INSERT INTO department VALUES(NULL, '研发部','广州');
INSERT INTO department VALUES(NULL, '销售部','深圳');
-- 添加员工,dep_id表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);
SELECT * FROM employee;
SELECT * FROM department;
因为有外键的约束,在员工表中添加一个不在部门表范围内的内容,则无法保存:
2)删除外键:ALTER TABLE 表名称 DROP FOREIGN KEY 外键名称;
-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;
3)在创建表后添加外键: ALTER TABLE 表名称 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
-- 添加外键
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id);
4)级联操作
若希望改动部门表的id,同时希望自动改动员工表中的id,这时就需要进行级联操作,需要在添加外键的时候设置级联:
- 添加级联操作:ALTER TABLE 表名称 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE ;
- 分类:级联更新 ON UPDATE CASCADE 级联删除 ON DELETE CASCADE
本文为博主原创文章,转载请注明出处!
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 国标GB28181协议客户端EasyGBS国标视频平台级联EasyNVR:EasyGBS如何实现调阅EasyNVR的视频通道?
- gitlab CI/CD 相关问题
- 微信jssdk分享接口
- 有赞 Flutter 混编方案
- 最近开发问题
- echarts相关问题总结
- 视频上云EasyNTS组网硬件设备登录后自动下线并清除设备信息是什么原因?
- 震惊! 再也不怕蹭网被发现了!
- 国标GB28181协议客户端EasyGBS国标视频平台级联EasyNVR:EasyNVR到EasyGBS上是如何注册及注销的?
- git全局忽略文件配置
- 2018-10-16近期vue开发总结
- 有赞埋点实践
- 树莓派配置LEDE(openwrt衍生版)拨号
- Android 沉浸式解析和轮子使用
- 腾讯云CDN使用(接入方式:COS源)