当前位置:网站首页>MySQL基础篇常用约束总结上篇
MySQL基础篇常用约束总结上篇
2022-06-11 10:19:00 【镜 玄】
常用约束总结上篇
1. 约束概述
1.1 为什么需要约束?
数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。
从以下四个方面考虑:
①实体完整性(Entity Integrity) :例如,同一个表中,不能存在两条完全相同无法区分的记录
②域完整性(Domain Integrity) :例如:年龄范围0-120,性别范围“男/女”
③引用完整性(Referential Integrity) :例如:员工所在部门,在部门表中要能找到这个部门
④用户自定义完整性(User-defined Integrity) :例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。
1.2 什么是约束?
约束是表级的强制规定。在创建表时分为列级约束和表级约束,列级约束是指在列后面追加约束条件,表级约束是指在写完所有的字段之后,单独一行写约束条件。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后通过ALTER TABLE 语句规定约束。
1.3 约束的分类
(1)根据约束数据列的限制
①单列约束:每个约束只约束一列
②多列约束:每个约束可约束多列数据
(2)根据约束的作用范围
①列级约束:只能作用在一个列上,跟在列的定义后面
②表级约束:可以作用在多个列上,不与列一起,而是单独定义
(3)根据约束起的功能
①NOT NULL 非空约束,规定某个字段不能为空
②UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
③PRIMARY KEY 主键(非空且唯一)约束
④FOREIGN KEY 外键约束
⑤CHECK 检查约束
⑥DEFAULT 默认值约束
查看某个表已有的约束
#information_schema数据库名(系统库)
#table_constraints表名称(专门存储各个表的约束)
SELECT * FROM information_schema.table_constraints
WHERE table_name = '表名称';
2. 非空约束(NOT NULL)
2.1 非空约束概述
(1)作用
限定某个字段/某列的值不允许为空
(2)关键字
NOT NULL
(3)特点
①默认,所有的类型的值都可以是NULL,包括INT、FLOAT等数据类型
②非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空
③一个表可以有很多列都分别限定了非空
④空字符串’'不等于NULL,0也不等于NULL
2.2 添加非空约束
(1)建表时
语法格式:
CREATE TABLE 表名称(
字段名 数据类型, 字段名 数据类型 NOT NULL,
字段名 数据类型 NOT NULL
);
使用样例:
CREATE TABLE test1(
id INT NOT NULL,
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25),
salary DECIMAL(10,2)
);

(2)建表后
使用格式:
alter table 表名称 modify 字段名 数据类型 not null;
使用样例:
ALTER TABLE test1
MODIFY email VARCHAR(25) NOT NULl;

2.3 删除非空约束
使用格式:
alter table 表名称 modify 字段名 数据类型;
使用样例:
ALTER TABLE test1
MODIFY email VARCHAR(25) NULL;

3. 唯一性约束UNIQUE
3.1 唯一性约束概述
(1) 作用
用来限制某个字段/某列的值不能重复。
(2) 关键字
UNIQUE
(3) 特点
①同一个表可以有多个唯一约束。
②唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
③唯一性约束允许列值为空。
④在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
⑤MySQL会给唯一约束的列上默认创建一个唯一索引。
3.2 添加唯一性约束
(1)建表时
添加格式:
方式1:
create table 表名称(
字段名 数据类型,
字段名 数据类型 unique,
字段名 数据类型 unique key,
字段名 数据类型
);
方式二:
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] unique key(字段名)
);
使用样例:
CREATE TABLE test2(
id INT UNIQUE,#列级约束
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10,2),
#表级约束
CONSTRAINT uk_test2_email UNIQUE(email)
);

使用下列语句,查看约束的名称:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE table_name = 'test2';

INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'Tom','[email protected]',5000);
插入下列语句会产生错误:
#1062 - Duplicate entry ‘1’ for key ‘test2.id’
INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'Jerry','[email protected]',5000);

(2)建表后指定唯一键约束
方式1:
alter table 表名称 add unique key(字段列表);
方式2:
alter table 表名称 modify 字段名 字段类型 unique;
ALTER TABLE test2
MODIFY last_name VARCHAR(15) UNIQUE;

3.3 复合唯一约束
使用格式:
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型, unique key(字段列表) #字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多 个字段的组合是唯一的
);
使用样例:
CREATE TABLE user(
id INT,
name VARCHAR(15),
password VARCHAR(15),
#复合型约束条件的添加,表级约束
CONSTRAINT uk_test2_name_pwd UNIQUE(name,password)
);
只要两个字段不是完全相同都可以添加成功
INSERT INTO user
VALUES (1,'Tom','abc');
INSERT INTO user
VALUES (1,'Tom','abcd');

3.4 删除唯一性约束
说明
①添加唯一性约束的列上也会自动创建唯一索引。
②删除唯一约束只能通过删除唯一索引的方式删除。
③删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
④如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。
删除样例:
ALTER TABLE test2
DROP INDEX last_name;

注意:可以通过 show index from 表名称; 查看表的索引
4. 主键约束PRIMARY KEY
4.1 主键约束概述
(1)作用
用来唯一标识表中的一行记录。
(2)关键字
PRIMARY KEY
(3)特点
①主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
②一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
③主键约束对应着表中的一列或者多列(复合主键)
④如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
⑤MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
⑥当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
⑦需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
4.2 添加主键约束
(1)建表时指定主键约束
使用格式:
列级约束
create table 表名称(
字段名 数据类型 primary key, #列级模式
字段名 数据类型,
字段名 数据类型
);
表级约束
create table 表名称(
字段名 数据类型,
字段名 数据类型, 字段名 数据类型,
[constraint 约束名] primary key(字段名) #表级模式
);
使用举例:
CREATE TABLE test3(
id INT PRIMARY KEY,#列级约束
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(20)
);

CREATE TABLE test4(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(20),
#表级约束
CONSTRAINT pk_test5_id PRIMARY KEY(id)
);

(2)建表后增加主键约束
使用格式:
ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表); #字段列表可以是一个字段,也可以是多个字段,如果是多 个字段的话,是复合主键
CREATE TABLE test6(
id INT,
name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)
);
ALTER TABLE test6
MODIFY id INT PRIMARY KEY;


4.3 复合主键
使用格式:
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
primary key(字段名1,字段名2) #表示字段1和字段2的组合是唯一的,也可以有更多个字段
);
使用样例:
学生表
create table student(
sid int, #学号
sname varchar(20), #姓名
tel char(11) unique key, #电话
cardid char(18) unique key #身份证号
);
课程表
create table course(
cid int, #课程编号
cname varchar(20) #课程名称
);
选课表
create table student_course(
id int,
sid int, #学号
cid int, #课程编号
score int,
unique key(sid,cid) #复合唯一
);
添加学生和课程
insert into student values(1,'张三','13710011002','101223199012015623');#成功
insert into student values(2,'李四','13710011003','101223199012015624');#成功
insert into course values(1001,'Java'),(1002,'MySQL');#成功


添加学生选课
使用复合主键时:复合主键组合在一起的内容不可以重复
insert into student_course
values
(1, 1, 1001, 89),
(2, 1, 1002, 90),
(3, 2, 1001, 88),
(4, 2, 1002, 56);#成功

主键删除格式:
alter table 表名称 drop primary key;
关于主键的删除这里不再加以描述,因为在实际的使用过程中一般不会用到的,删除的时候要慎重。
边栏推荐
- UGUI鼠标点击扩散UI效果
- Correct opening method of RPC | understand go native net/rpc package
- Browserfetcher class for getting started with puppeter
- RSA signature issues
- What hydraulic oil is used for Denison hydraulic pump? What are the requirements
- Q355HR钢板化学成分
- 本人书签常存的地址
- MySQL 权限管理和备份
- Unity字体间距
- [Objective-C] dynamically create controls
猜你喜欢

Q1's revenue exceeded Wall Street's expectations, and the value of Zhiwen group is waiting to return

MySQL basic learning notes 03

No more! The entry byte beat for a week and ran decisively.

Circuit board made of real gold -- golden finger

详解2.5G/5G/10G Base-T以太网接口物理层一致性测试!

对于力士乐电磁换向阀的功能与作用,你知道多少

With determination to forge ahead, JASMINER continues to deepen its brand strength

How much do you know about software compatibility testing? How to select a software compatibility testing organization?

Q1营收超预期,满帮为何赢得逆风增长?

Cisp-pte XSS Foundation
随机推荐
Understanding polymorphism?
Ugui mouse click diffusion UI effect
Record yesterday's embarrassment
吴恩达机器学习课程-第七周
[Objective-C] dynamically create controls
Streaming computing knowledge
LoRa模块无线收发通信技术详解
图表背后的秘密 | 技术指标讲解:唐奇安通道
利用PHP开发的一款万能、表白墙系统部分代码片段
关于马格齿轮泵的应用领域都有哪些?总结一下
WordPress网站备份
Wsarecv: an existing connection was forcefully closed by the remote host
【机器学习理论】True Positive, True Negative, False Positive, False Negative概念
ZigBee模块无线传输星形拓扑组网结构简介
TikTok在英国遭遇文化冲突,短期内众多员工离职
Unity字体间距
Pagoda panel backup and recovery data
[audio and video] Introduction to SEI
Ugui picture wall
How much do you know about the functions and functions of Rexroth solenoid directional valve