点击蓝色“潭时录”关注我丫
每天和小潭一起快乐的学习~
复制
你好,我是在学mysql的小潭。在上一期11-mysql基础-mysql中的DDL-数据类型介绍的推文中我们认识了mysql中的数据类型,本期我们将学习mysql中的约束。
mysql中的约束分为表级约束和列级约束。可以在创建表时添加约束,也可以在修改表时添加约束。
create table 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
);
含义:一种限制,用于限制表中的数据,保证表中的数据的准确和可靠性
复制
约束的分类
约束 | 含义 | 使用场景 | |
1 | NOT NULL | 非空,用于保证该字段的值不能为空 | 比如姓名,学号,工号等 |
2 | DEFAULT | 默认,用于保证该字段有默认值 | 比如性别 |
3 | PRIMARY KEY | 主键,用于保证该字段的值具有唯一性,并且非空 | 比如学号,员工编号等 |
4 | UNIQUE | 唯一,用于保证该字段的值具有唯一性,可以为空 | 比如座位号,工位号 |
5 | CHECK | 检查约束,mysql中不支持 | 比如年龄,性别等 |
6 | FOREIGN KEY | 外键,用于限制两个表的关系, 用于保证该字段的值必须来自于主表的关联列的值 在从表添加外键约束,用于引用主表中某列的值 | 比如专业编号,员工部门编号或工种编号等 |
约束的添加分类
列级约束 | 六大约束语法上都支持,但外键约束没有效果 |
表级约束 | 除了非空和默认,其他都支持 |
主键和唯一约束的区别和对比
保证唯一性 | 是否允许为空 | 一个表中可以有多少个 | 是否允许组合 | |
主键 | 可以 | 不允许 | 至多一个 | 允许,但不推荐 |
唯一 | 可以 | 允许 | 允许有多个 | 允许,但不推荐 |
外键的特点
1.要求在从表设置外键关系
2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3.主表的关联列必须是一个key(一般是主键或唯一)
4.插入数据时,先插入主表,再插入从表
删除数据时,先删除从表,在删除主表
复制
案例
创建表时添加约束
#创建表时添加约束
#1.添加列级约束
/*
语法:
直接在字段名和类型后追加约束类型即可
只支持:默认,非空,主键和唯一
*/
CREATE DATABASE students;
USE students;
CREATE TABLE stuinfo(
id INT PRIMARY KEY,#主键
stuName VARCHAR(20) NOT NULL, #非空
gender CHAR(1) CHECK(gender='男' OR gender='女'), #检查
seat INT UNIQUE, #唯一约束
age INT DEFAULT 20, #默认约束
majorId INT REFERENCES major(id) #外键
);
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
DESC stuinfo;
SHOW INDEX FROM stuinfo; #查看所有索引,包括主键,外键和唯一
#2.添加表级约束
/*
语法:在各个字段的最下面
[constraint 约束名] 约束类型(字段名)
其中constraint 约束名可以省略
*/
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id), #主键,主键名改名后名字仍会被默认为PRIMARY
CONSTRAINT uq UNIQUE(seat), #唯一键
CONSTRAINT ck CHECK(gender='男' OR gender='女'), #检查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) #外键
#以上constraint 约束名可以省略,写为primary key(id)...,此时默认名为()中的名
);
SHOW INDEX FROM stuinfo;
复制
#通用的写法:
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
gender CHAR(1),
age INT DEFAULT 20,
seat INT UNIQUE,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
复制
修改表时添加约束
#修改表时添加约束
/*
1.添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
2.添加表级约束
alter table 表名 add [constraint 约束名] 约束类型(字段名) [外键的引用];
*/
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT
);
DESC stuinfo;
#1.添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
#2.添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 20;
#3.添加主键
#列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#4.添加唯一
#列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
#5.添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
复制
修改表时删除约束
#修改表时删除约束
#1.删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#3.删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4.删除唯一
ALTER TABLE stuinfo DROP INDEX seat;
#5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
复制
小练习
/*
可创建随意emp2(仿照)表用于练习
*/
#向表emp2的id列中添加primary key约束(my_emp_id_pk)
ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY;
#向表dept2的id列中添加primary key约束(my_dept_id_pk)
ALTER TABLE emp2 ADD CONSTRAINT my_dept_id_pk PRIMARY KEY(id);
#向表emp2中添加列dept_id,并在其中定义foreign key约束,与之相关联的列是dept2表中的id
ALTER TABLE emp2 ADD COLUMN dept_id INT;
ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dept2 FOREIGN KEY(dept_id) REFERENCES dept2(id);
#列级约束:在列的后面,语法都支持,但外键没有效果,不可以起约束名
#表级约束:所有列下面,默认和非空不支持,其他支持,可以其约束名,但主键无效果
复制
补充知识点:标识列
又称为自增长列
含义:可以不用手动插入值,系统提供默认的序列值
特点:
1.标识列不一定和主键搭配,但要求是一个key来搭配
2.一个表中至多一个标识列
3.标识列类型只能是数值型
4.标识列可以通过 SET auto_increment_increment=3; 设置步长
也可以通过 手动插入值 设置起始值
复制
案例
#创建表时设置标识列
USE test;
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO tab_identity VALUES(NULL,'test'); #执行时不需要每次更改id值,默认从1开始
#或 insert into tab_identity(name) values('mysql');
#如果要设置起始值不从1开始,
#可以首次插入值使用INSERT INTO tab_identity VALUES(10,'test');随后使用(NULL,'test');
SELECT * FROM tab_identity;
TRUNCATE TABLE tab_identity;
SHOW VARIABLES LIKE 'auto_increment%';
#auto_increment_increment=1,auto_increment_offset=1 步长和起始偏移量
# mysql中不支持offset的设置
SET auto_increment_increment=3; #设置步长值为3,为全局量
#修改表时设置标识列
USE test;
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT,
NAME VARCHAR(20),
seat INT
);
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
DESC tab_identity;
#修改表时删除标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT;
DESC tab_identity;
复制
至此,mysql中的DDL部分将告一段落,下一期我们将开始学习mysql中的TCL,即事务控制语言部分的知识,敬请期待。
下期预告:mysql的TCL-初识事务

文章转载自潭时录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
3402次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
916次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
543次阅读
2025-04-17 17:02:24
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
369次阅读
2025-04-30 17:37:37
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
309次阅读
2025-04-28 11:01:25
SQL优化 - explain查看SQL执行计划(下)
金同学
302次阅读
2025-05-06 14:40:00
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
295次阅读
2025-04-30 12:17:54
MySQL 官方准备了 3 个月的羊毛,万万没想到 8 天就被薅秃了,看看JieKeXu怎么说?
青年数据库学习互助会
285次阅读
2025-05-09 10:07:42
MySQL 8.4 新特性深度解析:功能增强、废弃项与移除项全指南
JiekeXu
254次阅读
2025-04-18 20:21:32
4月“墨力原创作者计划”获奖名单公布!
墨天轮编辑部
219次阅读
2025-05-13 16:21:59