MySQL的约束

news2024/12/25 14:02:02

目录

1.约束(constraint)的概述

2.约束的分类

1.约束的字段的个数:

2.约束的作用范围:

3.约束的作用/功能

3.如何添加约束 

4.如何查看约束

5.非空约束(not null) 

6.唯一性约束(unique)

7.主键约束- primary key约束(一定要有)  

8.自增列:AUTO- increment  

9.外键约束- foreign key

10.check约束和default约束

1.  check约束

 2.  default约束

11.注意事项


1.约束(constraint)的概述

1.作用:为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制

2.数据完整性:数据完整性就是指数据的准确和可靠性。

        作用:防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息

3.限制对象:对表中字段的限制;

2.约束的分类

1.约束的字段的个数:

        单列约束/多列

2.约束的作用范围:

        列级约束:将约束声明在对应字段后面

        表级约束:在表中所有字段后面声明约束

3.约束的作用/功能

    •   not null(非空约束)

    •   unique(唯一性约束)

    •   primary key(主键约束)

    •   foreign key(外键约束)

    •   check(检查约束)

    •   default(默认值约束)

3.如何添加约束 

    •   create table时添加约束(推荐)

    •   alter table时增/删约束

#创建表时就添加约束
CREATE TABLE offices(
officeCode INT(10) PRIMARY KEY,
city VARCHAR(50) NOT NULL,
address VARCHAR(50),
country VARCHAR(50) NOT NULL,
postalCOde VARCHAR(50) UNIQUE
);

#创建表后添加约束

#设置主键约束
ALTER TABLE books
ADD PRIMARY KEY (id); 

#设置非空约束
ALTER TABLE books
MODIFY NAME VARCHAR(50) NOT NULL; 

4.如何查看约束

SELECT *
FROM information_schema.table_constraints
WHERE TABLE_NAME = 'employees';

查询结果: 

5.非空约束(not null) 

   1.  限制某字段/列的值不为空

    2.  默认所有类型的值都可以是null

    3.  not null只能某个列单独限定非空,不能组合非空

    4.  空字符串不等于null,0也不等于null

ALTER TABLE books
MODIFY price NOT NULL;

6.唯一性约束(unique)

    1.  限制某个字段/某列的值不能重复

    2.  唯一性约束,允许出现多个空值null

    3.  mysql会给唯一约束的列默认创建一个唯一索引

    4.  创建唯一约束时,如果不命名则默认与列名相同

    5.  添加约束的两种方式

#第一种方式
CREATE TABLE orders
c_id INT(11), UNIQUE;

#第二种方式
ALTER TABLE test
MODIFY last_name VARCHAR(15) UNIQUE;

    6.  复合的唯一性约束


CREATE TABLE orders(
			id INT,
			NAME VARCHAR(15),
			PASSWORD VARCHAR(15),
			CONSTRAINT user_name_pwd UNIQUE(NAME,PASSWORD)
			 );

    7.  删除唯一性约束

    •   添加唯一性约束的列上也会自动创建唯一索引

    •   删除唯一约束只能通过删除唯一索引的方式删除

    •   删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样

    •   如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名

    •   删除方法

7.主键约束- primary key约束(一定要有)  

    1.  作用:用来唯一标识表中的一行记录

    2.  特点:主键约束相当于唯一约束+非空约束,主键约束列不允许重复,也不允许出现空值

    3.  一个表最多有一个主键约束

    4.  mysql的主键名都是primary,无法自主命名

    5.  创建主键约束时,默认在所在列建立对应的主键索引

    6.  如何添加主键约束?

#只是放一起做对比,主键约束最多只有一个,不能重复
CREATE TABLE orders(
            #列级约束
			#o_num INT(11) PRIMARY KEY,
			o_date DATE,
			c_id INT(11),
            #表级约束
			CONSTRAINT fk_orders_cId FOREIGN KEY(c_id) 
			 );

    7.  如何删除主键约束(在实际开发中,不会去删除表中的主键约束)

ALTER TABLE test
DROP PRIMARY KEY;

8.自增列:AUTO- increment  

    1.  作用:某个字段的值自增

    2.  一个表中最多一个自增长列

    3.  自增长约束列必须是键列(主键列,唯一键列)

    4.  自增列数据类型必须为整数数据类型

    5.  当我们向主键(含auto- increment)的字段上添加0或null时,实际上会自动的往上添加指定的字段的数值(即自增)

    6.  开发中,一旦主键作用的字段上声明有

  AUTO- increment,则在添加数据时,不要    给主键对应的字段去赋值

    1.  如何添加自增列?

    2.  如何删除自增列?

    3.  mysql8.0新特性-自增变量的持久化

    •   在mysql服务器重启之后,8.0中仍会在重做日志保存删除后的变量,5.7中只是在内存中保留,重启后消失。

#方式一
CREATE TABLE orders(
			o_num INT(11) PRIMARY KEY AUTO_INCREMENT,
			o_date DATE);

#方式二
ALTER TABLE test
MODIFY id INT AUTO_INCREMENT;

9.外键约束- foreign key

    1.  作用:限定某个表的某个字段的引用完整性

    2.  主表(父表):被引用的表/被参考的表

    3.  从表(子表):引用/参考他人的表

    4.  从表的外键列,必须引用主表的主键/唯一约束列

    5.  若不给外键约束命名,则默认自动产生一个外键名

    6.  删表:先删从表再删主表

    7.  创建外键约束时,默认会在所在列上建立对应的普通索引;删除外键约束时要手动删除索引

    8.  如何添加外键约束


#先创建主表
CREATE TABLE dept1(
dept_id INT PRIMARY KEY,
dept_name VARCHAR(15)
);

#再创建从表
CREATE TABLE emp1(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
department_id INT
);

#将department_id作为外键与dept2中的dept_id保持一致
ALTER TABLE emp1
ADD CONSTRAINT fk_emp2_dept_id FOREIGN KEY(department_id) REFERENCES dept2(dept_id);

    9.  约束等级:cascade方式;set null方式

    •   结论:对于外键约束,最好是采用:  on update cascade on delete restrict

   •   在mysql中,外键约束是有成本的,需要消耗系统资源。对于并发的SQL操作,有可能不适合;因为外键约束的系统开销而变得非常慢。故mysql不得使用外键约束,一切外键概念必须在应用层解决。

10.check约束和default约束

1.  check约束

        检查某个字段的值是否符合要求,一般指的是值得范围;5.7不支持;8.0支持check约束

CREATE TABLE emp2(
emp_id INT,
emp_name VARCHAR(15),
salary DECIMAL(10,2) CHECK(salary > 2000)
);

 2.  default约束

        给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值

CREATE TABLE emp3(
emp_id INT,
emp_name VARCHAR(15),
salary DECIMAL(10,2) DEFAULT 2000
);

11.一些注意事项

    •   为什么建表时,加not null/default’’/default 0?

答:不想让表中出现null值

    •   为什么不要null值?

答:在运算时不好比较;效率不高,影响提高索引效果

    •   带auto- increment约束的字段值是从一开始吗?

答:默认是从1开始,但也可以设置初始值,从初始值开始自增。

    •   是不是每个表都能够任意选择存储引擎?

答:外键约束不能跨引擎使用;mysql支持多种存储引擎,每个表都可以指定一个不同的存储引擎,但外键约束用来保证数据的参照完整性的,如果表之间需要关联外键,却指定了不同的存储引擎,那么这些表之间不能创建外键约束。因此不能随意选择存储引擎。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/786768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

赛多利斯Sartorius天平java后端对接

业务场景 要将赛多利斯天平的数据读出来解析并且显示到对应的数字框,支持一台设备连接多种精度的天平 后端实现 通过协议解析数据,然后将数据存储 详细代码就不贴了,感兴趣的可以私聊我

区间预测 | MATLAB实现基于Bootstrap的区间预测

区间预测 | MATLAB实现基于Bootstrap的区间预测 目录 区间预测 | MATLAB实现基于Bootstrap的区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现基于Bootstrap的区间预测 MATLAB实现基于Bootstrap区间预测(完整源码和数据&…

被大厂抢着要,最终拿到20k的高薪offer

被大厂抢着要,各个大企业为留住自己不断给自己加薪,这种只在梦中见过的场景,真实的发生在黑马学长身上了! 周同学,刚毕业后便从事的IT行业,但 2 年以来,工作一直没有什么起色,为了跳…

Redis高级篇(二)

Redis高级篇之多级缓存 什么是多级缓存 JVM进程缓存 Lua语法入门 实现多级缓存 缓存同步 一、什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题:…

React 框架下自己写一个braft编辑器,然后将编辑器内容展示在网页端

1.首先自己写一个编辑器 输入文字; 支持选择表情; 可添加小程序链接;可添加网页链接;并且可以编辑删除;效果如下 2.输入完毕后,点击文本输入框保存,将便携式内容回显, 渲染时…

python中——requests爬虫【中文乱码】的3种解决方法

requests是一个较为简单易用的HTTP请求库,是python中编写爬虫程序最基础常用的一个库。 而【中文乱码】问题,是最常遇到的问题,对于初学者来说,是很困恼的。 本文将详细说明,python中使用requests库编写爬虫程序时&…

List集合类详解(附加思维导图)

目录 一、List集合思维导图 二、List集合类的常见方法 2.1、ArrayList集合常用方法 2.2、LinkedList集合常用方法 一、List集合思维导图 二、List集合类的常见方法 2.1、ArrayList集合常用方法 ①.add(Object element) 向列表的尾部添加指定的元素。 ②.size() 返回列表中…

前端vue部署到nginx并且配置https安全证书全流程

说明一下: 本人原本使用的是docker安装nginx通过挂载实现部署,但是出现了很多bug(例如部署安全证书后还是无法访问),所以困扰了很久,最后改为本地安装nginx,最终在不懈的努力下终于按照好了&…

H5页面 卡片 分享朋友圈和好友

项目背景: 前后端分离: 后端: C# 开发 前端: 就是微信中打开的 H5页面 纯 H5 业务流程: 因为在 h5 中实现 卡片分享 的一个字段, 需要后端 访问 腾讯API 生成,所以整个分享结构和流程就比较长&#xff…

Stable diffusion 和 Midjourney 怎么选?

通过这段时间的摸索,我将和你探讨,对普通人来说,Stable diffusion 和 Midjourney 怎么选?最重要的是,学好影视后期制作对 AI 绘画创作有哪些帮助?反过来,AI 绘画对影视后期又有哪些帮助&#xf…

Python案例变量实践

编程:非常需要实践,不要光看,一定要动动手 什么是程序? 数据结构算法 数据结构:存储和使用数据的方式 算法:解决问题的步骤 解决一个问题的时候,分析问题,设计算法,编…

网约车服务端线上流量巡检与测试验收技术

摘要 滴滴网约车致力于让出行更美好,平台为司乘提供良好体验的同时承载了广大群众的出行服务,致使我们对服务可用性的要求较高。更快地发现系统bug,可以让更少的司乘用户受影响。发现bug的能力更精细,可以让一些不易被用户感知但…

2D坐标系下的点的转换矩阵(平移、缩放、旋转、错切)

文章目录 1. 平移 (Translation)2. 缩放 (Scaling)3. 旋转 (Rotation)4. 错切 (Shearing)5. 镜像 (Reflection) 1. 平移 (Translation&#xff09…

Nautilus Chain:主权模块化区块链的早期实践

“Nautilus Chain 是目前行业内首个以模块化的方式构建的主权 Layer3 区块链系统,其也是 Celestia 模块化 Layer0 体系下最早的印证者,现在 Nautilus Chain 主网正式上线,揭示着模块化区块链正在从早期的理论阶段走向实践。” Celestia &…

Godot 4 源码分析 - 获取属性信息

在管道通信基础上,可进行宿主程序与Godot的双向通信。 先拿属性信息试试手。 DrGraph端 static UnicodeString command "Book.position"; if (InputQuery("输入窗口", "请输入待获取的属性信息", command)) {TDrStream_Get drGet…

5.10 Bootstrap 按钮(Button)插件

文章目录 Bootstrap 按钮(Button)插件加载状态单个切换复选框(Checkbox)单选按钮(Radio)用法选项方法 Bootstrap 按钮(Button)插件 按钮(Button)在 Bootstrap…

forEach遍历访问set造成的无限循环问题

抛出问题 先给出一段代码,我们创建了一个集合set,它里面有一个元素数字1和2,接着我们调用forEach方法来遍历该集合。在遍历函数中,首先调用delete方法删除数字1,再执行了某些业务操作后紧接着调用add方法将数字1加回&…

Linux系统root用户切换及密码修改

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B:美国纽约公共自行车使用量预测分析 问题二Python代码分析

2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B:美国纽约公共自行车使用量预测分析 问题二 相关链接 【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题一Python代码分析 【2023 年第二届钉钉杯大学生大数据挑…

面试—Redis相关

文章目录 一、概述二、缓存1、缓存穿透2、缓存击穿3、缓存雪崩4、双写一致性5、持久化6、数据过期策略7、数据淘汰策略 三、分布式锁四、其它面试题1、主从复制2、哨兵3、分片集群结构4、I/O多路复用 一、概述 使用场景: Redis的数据持久化策略有哪些什么是缓存穿透…