前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具

约束

作者头像
code-child
发布于 2023-05-30 03:17:56
发布于 2023-05-30 03:17:56
82500
代码可运行
举报
文章被收录于专栏:codechildcodechild
运行总次数:0
代码可运行

为什么需要约束?

为了数据的完整性

约束的分类

按列分:

  • 单列约束
  • 多列约束

按约束 的作用范围:

  • 列级约束
  • 表记约束、

下面几种约束

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlNOT NULL#非空约束,指定某个字段不能为空
UNIQUE  #唯一约束,,让某字段在整个表中是唯一的
PRIMARY KEY #主键约束
FOREIGN KEY #外键约束
CHECK #检查约束	8.0才支持的,5.7还不支持
DEFAULT #默认值约束

非空约束

建表的时候给它约束,加在类型的后面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlCREATE TABLE student1(
sno VARCHAR(10) ,
sname VARCHAR(10) NOT NULL,
age INT NOT NULL
);

当然,对于一个已经建好的表,我们也可以对它进行修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlALTER TABLE student1
MODIFY sno VARCHAR(10) NOT NULL;

删除非空约束,像上面那样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlALTER TABLE student1
MODIFY sno VARCHAR(10) NULL;

注意一点: 如果原来的字段是空,那么你就不能把该字段修改成可以为空,当然你修改也会报错

唯一性约束

作用在字段上,使该字段不能有重复的值出现

  • 同一个表可以有多个唯一约束
  • 唯一约束可以是某个列,也可以多个列组合的唯一
  • 唯一的字段可以为空的
  • 在创建约束的时候,如果不给约束命名的话,那么默认和该列的名字相同。如果是多个列的组合,那么默认的名字就是第一个字段的名字
  • MySQL会给唯一约束的列默认创建一个唯一索引

创建表的时候进行添加约束:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlCREATE TABLE student2(
sno VARCHAR(10) UNIQUE,#列级约束,写unique key 也是可以的
sname VARCHAR(10) ,
age INT,
CONSTRAINT sname_uni UNIQUE KEY(sname)#表级约束
);
#查看表中的约束
SELECT * FROM information_schema.`TABLE_CONSTRAINTS`
WHERE table_name = 'student2'

当没有指定的名字的时候,就是列的名字。

测试它的唯一性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sql#先插入1条记录
INSERT INTO student2(sno,sname,age)
VALUE('111','haha',12)
#测试插入另一个记录
INSERT INTO student2(sno,sname,age)
VALUE('111','aaaaa',11)

唯一约束的列可以为空,可以多次插入——其实很好理解,空就是没有嘛,没有和唯一有什么关系嘛。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlINSERT INTO student2(sno,sname,age)
VALUE(NULL,'cd',23),
(NULL,'fe',43);

在创建完成表之后添加唯一性约束 用ALTER 先创建一个表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlCREATE TABLE student3(
sno VARCHAR(10),
sname VARCHAR(10) ,
age INT
);

方式1用ADD添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlALTER TABLE student3
ADD CONSTRAINT sno_uni UNIQUE(sno);

方式2用MODIFY进行修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlALTER TABLE student3
MODIFY sname VARCHAR(10) UNIQUE;

复合唯一约束

所谓的复合唯一约束就是把多个段合在一起进行约束

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlCREATE TABLE student4(
sno VARCHAR(10),
sname VARCHAR(10),
sex VARCHAR(5),
CONSTRAINT sname_sex_uni UNIQUE(sname,sex)
)

只要snamesex这两个字段不全相等就可以。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlINSERT INTO student4
VALUE('123332','ml','男'),
('123','hh','女');

#在插入一条数据
INSERT INTO student4
VALUE('3543254','ml','女')# 该条语句可以插入

#插入一个组合约束,则就会报错,不允许进行插入
INSERT INTO student4
VALUE('1111111','ml','男')

删除唯一性约束

删除唯一性约束只能通过删除唯一索引的方式删除 删除唯一索引就要知道它的名字,唯一索引的名字就是唯一约束的名字

查看约束

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlSELECT * FROM information_schema.`TABLE_CONSTRAINTS`
WHERE table_name='表名'

删除的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlALTER TABLE student4
DROP INDEX 索引名

PRIMARY KEY约束

主键约束相当于唯一约束+非空约束。主键约束的列不允许重复,也不允许出现空值 一个表最多有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别创建 主键约束对应表中的一列或者多列(复合主键) MySQL的主键名总是PRIMARY,自己命名了也没有用 创建主键约束时,系统默认建立对应的主键索引。如果删除主键约束、对应的索引就自动删除了。

创建主键约束

建表时指定主键约束

列级约束——在字段后面进行添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlCREATE TABLE student5(
sno VARCHAR(10) PRIMARY KEY,
sname VARCHAR(10),
sex VARCHAR(5),
age INT
);

表级约束——所有字段的后面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlCREATE TABLE student6(
sno VARCHAR(10),
sname VARCHAR(10),
sex VARCHAR(5),
age INT,
PRIMARY KEY(sno)//没有必要起名字,因为起了名字,还是叫primary
);

建表之后添加主键

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlALTER TABLE 表名 ADD PRIMARY KEY(字段)

复合主键和复合唯一约束一样,()里面放入多个字段,每个字段用,隔开

删除主键约束 在实际的开发中,并不会删除主键 下面是删除主键

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlALTER TABLE 表名 DROP PRIMARY KEY #因为主键是唯一的,不需要指明主键名

自增列

关键字:AUTO_INCREMENT

一个表中最多有一个自增列 当需要产生唯一标识符或者顺序值时,可以设置自增列 自增列所在的列必须是键列(主键列primary key、唯一键列 unique key) 自增列的数据类型必须是整型类型 当添加数据的时候,如果指定了此列是0,或者null,那么添加成功的时候,会从当前最大值的基础上自增

添加自增列 建表时添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlCREATE TABLE emp1(
id INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10)
)

建表完成之后添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlALTER TABLE 表名 MODIFY 字段名 数据类型 AUTO_INCREMENT
#如
ALTER TABLE emp2 MODIFY id INT PRIMARY KEY AUTO_INCREMENT

删除自增列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sqlALTER TABLE 表名 MODIFY 字段名 类型 #相当于重置了一下

MySQL8.0中,自增变量具有持久化——删除之后,计数器没有变 比如:当前是5,删除5这条记录的之后,重启服务器,再次添加数据,就是6,而不是5。

FOREIGN KEY约束

外键约束

外键约束会涉及到主表和从表 主表(父表):被引用的表 从表(子表):引用别人的表

从表的外键必须引用主表的主键或者唯一性约束的列 在创建外键的时候,如果不给外键约束的话,默认名不是列名,而是自动产生一个外键名,当然也可以指定外键约束名

创建表的顺序,先创建主表,再创建从表 删表,先删从表,再上主表 从表的外键列和主表的列名字可以不相同,但是数据类型必须一样。

当创建外键约束时,系统默认会在所在的列上创建对应的普通索引,索引名就是外键的约束名。删除外键约束后,必须手动删除对应的索引

语法: 看下面的例子

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sql#主表
CREATE TABLE student(
last_name VARCHAR(10),
stusno VARCHAR(10) PRIMARY KEY,
age INT
)
#从表
CREATE TABLE task(
tesno VARCHAR(10),
age INT ,
CONSTRAINT fk_sno FOREIGN KEY(tesno) REFERENCES student(stusno) 
)

当然建表之后也是可以进行更改的。

其实这东西让我感觉好麻烦,看着都头疼。 因为创建好之后,我们会发现插入数据也比较麻烦,删除也麻烦,动不动就各种问题 所以,对于外键约束,最好采用ON UPDATE CASCADE ON DELETE RESTRICT的方式 也可以用下面的约束等级,等用到了再说。

在阿里开发规范中:不得使用外键约束与级联,一切外键概念必须在应用层解决

CHECK约束

检查模字段的值是否复合要求 MySQL5.7可以支持该约束,但是不起作用。但是在MySQL8.0中就可以使用check约束了

DEFAULT约束

指定某个字段默认值,意思就是当该字段没有插入数据的时候,使用默认值 就是在后面加上default

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-26M,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么需要约束?
  • 约束的分类
  • 下面几种约束
    • 非空约束
    • 唯一性约束
      • 删除唯一性约束
    • PRIMARY KEY约束
      • 创建主键约束
    • 自增列
  • FOREIGN KEY约束
  • CHECK约束
  • DEFAULT约束
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档