MySQL约束与事务

news2024/12/26 10:39:15

一、MySQL约束

参考【MySQL】约束_mysql约束-CSDN博客

  • not null:非空约束
  • unique:唯一性约束
  • primary key:主键约束
  • foreign key:外键约束
  • check:检查约束
  • default:默认值约束

如何添加约束

  • 在CREATE TABLE时添加约束
  • 使用ALTER TABLE添加约束,也可以使用这个删除约束

约束类型介绍

1. NOT NULL 非空约束:限制某个字段/某列的值不允许为空

注意:
空字符串不等于null,0也不等于null
如果没有使用not null约束,那么默认情况下所有的类型都是可以为null的
非空约束只能设置成列级约束
1)如何在建表时创建非空约束

CREATE TABLE t_decade_test_not_null(
id INT NOT NULL,
last_name VARVHAR(20) NOT NULL,
email VARCHAR(25),
salary DECIMAL(10,2)
);

2)创建完这个表后,如下几种情况会报错

  • 使用insert插入数据,id或者last_name的值为null
  • 使用insert插入数据,没有给id或者last_name字段赋值,且没有指定它的默认值
  • 只用update更新数据,给id或者last_name字段传递的值为null

3)如何使用ALTER TABLE添加约束,我们还是以之前的t_decade_test_not_null为例
对email字段添加一个非空约束,但是如果email字段已经存在null值,那么下方的语句是无法执行的

ALTER TABLE t_decade_test_not_null
MODIFY email VARCHAR(25) NOT NULL;

4)如何使用ALTER TABLE删除约束呢?其实只要把NOT NULL改成NULL即可

ALTER TABLE t_decade_test_not_null
MODIFY email VARCHAR(25) NULL;
2. UNIQUE 唯一性约束:确保某一列/某一个字段的值不会重复

注意点:
MySQL会给唯一约束的列上默认建一个唯一索引
一个表中可以设置多个唯一性约束
唯一性约束可以针对某一个字段,也可以针对某几个字段组合起来的值
唯一性约束允许字段为空。如果两条数据,该字段都赋值null,不会受到唯一性约束的限制
创建唯一性约束的时候,如果不给约束命名,那就默认唯一性约束的名字和字段名相同

1)如何在建表时,给字段添加唯一性约束

CREATE TABLE t_decade_test_unique(
id INT UNIQUE #这就是列级约束,
last_name VARVHAR(20),
email VARCHAR(25),
salary DECIMAL(10,2),
# 添加表级约束,一般约束的命名格式为:作用_表名_字段
CONSTRAINT uk_t_decade_test_unique_email UNIQUE(email)
);

2)如何使用ALTER TABLE来添加约束
方式一:

alter table 表名 add UNIQUE(字段名称)

alter table t_decade_test_unique add UNIQUE(lastname);

# 如果要给约束取名,还是使用constraint
alter table t_decade_test_unique add constraint uk_t_decade_test_unique_lastname UNIQUE(lastname,email);

方式二:

alter table 表名 modify 字段名 字段类型 UNIQUE

alter table t_decade_test_unique MODIFY last_name VARVHAR(20) UNIQUE;

3)什么是复合的唯一性约束
可以理解为,我们对多个字段进行组合
要求两条数据中,这几个字段的值不能完全相同,必须有一个或者几个字段的值不一样

CREATE TABLE t_unique_user(
id INT,
user_name VARCHAR(20),
user_pwd VARCHAR(15),
constraint uk_t_unique_user_nameAndPwd UNIQUE(user_name,user_pwd);
);

这样一来,这个表中的任意两条数据,name和pwd字段就不能完全相同

4)删除唯一性约束

创建唯一性约束的字段会自动创建一个唯一索引,所以我们只能通过删除唯一索引的方式来删除该约束
而唯一索引的名和唯一性约束的名称是一样的
如果是单列约束,那默认就和字段名称相同,如果是复合约束,那默认就和()中排在第一位的字段名相同。当然我们也可以使用constraint来自定义约束名

alter table t_unique_user
DROP index 索引名;

我们也可以通过show index from 表名;查看表的索引

3. PRIMARY KEY 主键约束:用来标识表中的一行记录,也就是说,可以通过这个来确定某条数据是独一无二的

特点:主键约束相当于唯一性约束+非空约束
注意点:

  • 一个表中只能有一个主键约束,它可以在列级别创建,也可以在表级别创建
  • 主键约束对应着表中的一列或者多列(复合主键)
  • 如果是多列组合的复合主键约束,那么任何一列都不允许为空,而且组合的值不允许重复
  • 主键约束的名总是PRIMARY,它不能像前面的唯一性约束一样自定义名称
  • 创建主键约束后,系统会自动在对应的列或者组合字段上创建主键索引(根据主键进行查询的效率更高),如果删除了主键约束,对应的主键索引也会被删除
  • 不要修改主键字段的值,因为他是数据记录的唯一标识,如果修改了主键的值,就有可能破坏数据的完整性
4. AUTO_INCREMENT 自增列:让某个字段的值自增

特点:

  • 一个表只能有一个自增字段
  • 当需要产生唯一标识符或者顺序值的时候,可以设置自增长
  • 自增长约束的列必须是键列(必须要有主键约束或者唯一性约束),而且自增长约束的列必须是整数类型,在没有给第一条数据的该字段显式赋值情况下,默认从1开始
  • 如果我们在插入某条数据时,自增列对应的value填的是0或者null,实际上入表的值会是该字段当前最大值加1,并不会展示为0或者null
5.  FOREIGN KEY 外键约束:用来让两张表的数据建立连接,保持数据的一致性和完整性

了解什么是主表/从表或者说什么是父表/子表:
主表(父表):被引用的表,比如上面的部门表
从表(子表):引用别人的表,比如上面的员工表
特点:

  • 从表的外键引用/参考的必须是主表的主键列或者是唯一约束的那个字段,这是因为被依赖/被参考的值必须是唯一的
  • 创建外键约束时,如果没有自定义名称,那么会自动生成一个外键名,不会像之前介绍的约束一样和列名保持一致了
  • 如果在创建表的时候就指定外键约束,那么必须先创建主表,再创建从表
  • 删表时,先删从表(或者先删外键约束),再删主表
  • 当主表的数据被从表参照时,主表的数据将不被允许删除,如果要删除数据,需要先去从表中删除依赖该记录的数据,然后再删除主表数据
  • 在从表中指定外键约束,一个表可以建立多个外键约束
  • 从表的外键列和主表中被引用的列不一定要名称相同,但是数据类型必须保持一致
  • 创建外键约束时,系统会默认在所在的列上建立普通索引,索引名=列名(列名≠外键约束名)
  • 删除外键约束后,必须手动删除对应的索引

创建方式:

 

1)在create table时指定外键约束 

CREATE TABLE t_dept(
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(20)
);

CREATE TABLE t_emp(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(20),
department_id INT,
# 使用表级约束的方式指定外键约束
CONSTRAINT fk_emp_department_id FOREIGN KEY (department_id) REFERENCES t_dept (dept_id)
);

2)演示外键效果
在创建了t_dept和t_emp表之后
如果两张表都是空表,当我们直接执行insert into t_emp values(1,"decade",10);
SQL执行会报错,因为我们从表t_emp依赖的主表t_dept中并没有id为10的记录

所以我们要先执行
insert into t_dept values(10,"技术部");
再执行insert into t_emp values(1,"decade",10);

执行上述插入语句之后
假设我们执行delete from t_dept where id = 10;,语句还是会报错,因为这条数据被从表依赖
同样的,当我们执行update t_dept set id = 20 where dept_name = '技术部';时,语句也会报错

3)建表后如何使用alter table添加外键约束

CREATE TABLE t_dept2(
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(20)
);

CREATE TABLE t_emp2(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(20),
department_id INT
);

ALTER TABLE t_emp2
ADD CONSTRAINT fk_emp2_department_id FOREIGN KEY (department_id) REFERENCES t_dept2 (dept_id);

4)删除外键约束

# 第一步:先查看表中的约束名,删除约束
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE table_name = '表名称';

ALTER TABLE 从表名
DROP FOREIGN KEY 外键约束名称;

# 第二步:查看索引名和删除索引
SHOW INDEX FROM 表名称;

ALTER TABLE 从表名 DROP INDEX 索引名;
6. CHECK 检查约束:检查某个字段的值是否复合要求 

 建表时添加

CREATE TABLE t_emp(
id iNT PRIMARY KEY AUTO_INCREMENT
last_name VARCHAR(20),
salary DECIMAL(10,2) CHECK(salary>5000)
);

 如果你执行insert into t_emp values(1, "彭于晏", 1500);,语句就会报错

7. DEFAULT默认值约束:给某个字段设置默认值,如果在插入数据时没有给该字段显式赋值,那么就赋值为默认值

1)在创建表时添加约束

CREATE TABLE t_emp(
id iNT PRIMARY KEY AUTO_INCREMENT
last_name VARCHAR(20),
salary DECIMAL(10,2) DEFAULT 3000
);

如果你执行insert into t_emp values(1, "彭于晏");,那么此条数据对应salary那一列的值就是3000

2)使用ALTER TABLE添加约束

CREATE TABLE t_emp(
id iNT PRIMARY KEY AUTO_INCREMENT
last_name VARCHAR(20),
salary DECIMAL(10,2)
);

ALTER TABLE t_emp
MODIFY salary DECIMAL(10,2) DEFAULT 3000;

3)删除约束

ALTER TABLE t_emp
MODIFY salary DECIMAL(10,2);

 

 

 

 

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

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

相关文章

zyx青岛实训day34 初步了解Docker与套接字的应用

回顾 1、主从复制(高可用) 2、传统的主从复制 3、gtids事务型的主从复制 4、注意 1)server_id唯一 2)8.X版本需要get_ssl_pub_key 3)5.X不需要 4)change master to 5)stop | start slave 5…

YOLOv5调用海康工业相机实时检测

目录 一、调用海康工业摄像头 1.1 DirectShow插件安装 1.2 查找摄像头编号 1.3 摄像头调用测试 二、修改YOLOv5相关参数 2.1 detect.py修改 2.2 datasets.py修改 一、调用海康工业摄像头 现在可直接利用cv2.VideoCapture()接口调用海康机器人工业相机,首先在官…

【数据结构】二叉搜索树的功能实现详解

文章目录 二叉搜索树查找插入删除找到要删除的节点删除节点1. 要删除节点的左孩子为空2. 要删除节点的右孩子为空3. 要删除的节点的左右孩子都不为空 完整代码 二叉搜索树 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它…

IOS17双开微信且自动刷新

前提文件 需要在Sideloadly官网下载iTunes和iCloud这2个文件:https://sideloadly.io/, SideStore侧载商店官网下载另外4个文件:https://sidestore.io/ 如图,如果文件无法下载(需要科学上网)可以下载我的资源包尝试 安装步骤 …

C语言学习笔记 Day15(文件管理--下)

Day15 内容梳理: 目录 C语言学习笔记 Day14(文件管理--上)-CSDN博客 Chapter 10 文件操作 10.2 文件加密、解密 (1)文件加密 (2)文件解密 10.3 文件读取、写入 (1&#xff…

可视化数据大屏设计案例

可视化数据大屏开发-能源调度大屏展示 可视化数据大屏开发-房地产经营分析 可视化大屏开发-预售业务数据看板 可视化大屏开发-城市路况监测大屏

深入Redis:细谈持久化

Redis的数据是保存在内存中的,内存里面的数据是不持久的,要想做到持久化,必须要把在内存中的数据储存到硬盘上。 Redis速度非常快,数据只有在内存中才有这样的速度,但是为了持久,数据还是要想办法保存到硬…

【分治——归并排序】排序数组的归并方法

目录 1.前言2.题目简介3.求解思路4.示例代码 1.前言 今天简单展示一个归并排序解题&#xff0c;难度简单。 2.题目简介 题目链接&#xff1a;LINK 3.求解思路 4.示例代码 //归并排序 class Solution { public:vector<int> tmp;vector<int> sortArray(vector&…

【Web开发工具】基于Windows系统下的WebStorm安装教程

目录 安装WebStorm1.官网下载WebStorm2.选择安装位置3.关闭应用 下载并解压工具下载地址解压执行Done输入Code 安装WebStorm 1.官网下载WebStorm 我自己的网盘链接: https://pan.baidu.com/s/17PJu8Kf_fdX3gi588ubTqQ?pwd6666 2.选择安装位置 下一步下一步就行&#xff0c…

有手就会之使用Dify构建RAG聊天应用(基于私有知识库和搜索引擎)

之前我的文章里写的是通过langchain来构建RAG应用&#xff0c;对于很多人来说。langchain作为一个框架上手难度大&#xff0c;代码不够直观。但是通过dify你将学会可视化搭建工作流。 什么是dify&#xff1f; Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即…

如何判断B端真实需求?5大经验技巧

准确判断B端真实需求能确保软件开发项目紧贴用户实际需求&#xff0c;减少返工&#xff0c;加快开发速度&#xff0c;提升客户满意度和产品竞争力。如果没有采用有效的技巧和经验来判断B端的真实需求&#xff0c;可能会导致软件开发项目偏离客户实际需求&#xff0c;引发频繁的…

【数据分析预备】Numpy入门

Jupyter Notebook 是一个基于网页的交互式计算环境编写代码、运行代码、查看输出、可视化数据、分享报告文档按单元格运行代码可展示的信息格式更丰富&#xff08;支持Markdown和Latex)交互式运行环境 安装 cmd窗口 pip install notebook启动 jupyter notebook退出 CtrlC …

阿里巴巴alibaba商品采集API获取商品列表商品详情接口

在跨境电商和B2B贸易日益繁荣的今天&#xff0c;如何高效、准确地获取商品信息成为了商家们关注的焦点。阿里巴巴作为全球领先的B2B电商平台&#xff0c;凭借其庞大的商品数据库和强大的技术支持&#xff0c;为商家们提供了丰富的API接口服务&#xff0c;其中alibaba.item_get接…

第十三节:学习Springboot整合mybatis——完整篇(自学Spring boot 3.x的第三天)

大家好&#xff0c;今天记录下学习springboot的第三天。​网创有方 这节详细记录了如何使用springboot整合mybatis方法&#xff0c;并成功实现将请求信息插入本地的mysql数据库。 由于只是为了方便本地验证&#xff0c;实际项目是需要部署到服务器上去的&#xff0c;所以就采用…

MQ专题:消费幂等性

一、提要 1.1 通过本文将获得 消息投递的通用代码 非事务消息的投递事务消息的投递任意延迟消息的投递&#xff0c;不依赖于任何MQ上面这些投递都支持批量的方式投递失败自动重试的代码 幂等消费的通用代码消费失败&#xff0c;衰减式自动重试的通用代码 1.2本文涉及到的主要…

新一代网络研发利器——开物™,让用户每一行代码都贡献在核心创新

随着云计算、人工智能、大数据的快速发展&#xff0c;现有的IT系统越来越复杂&#xff0c;传统网络技术难以满足新的业务需求&#xff0c;DPU技术开始崭露头角&#xff0c;越来越多的企业与研究机构认识到高性能网络处理技术带来的巨大价值&#xff0c;并积极开展创新与实践&am…

985硕闭着眼都有15k以上的月薪

985 闭眼 今天在牛客上看到一篇直呼好家伙的帖子&#xff1a; 这位同学指出&#xff1a;论坛里个个 985 的硕士闭着眼睛都有 15k 以上的月薪&#xff0c;还天天嚷嚷着研究生白读了&#xff0c;天天嚷嚷着反向读研了 ... 通常这样的帖子&#xff0c;都会被评论区喷成筛子。 结果…

微积分复习笔记 Calculus Volume 1 - 1.3Trigonometric Functions

1.3 Trigonometric Functions - Calculus Volume 1 | OpenStax

ELK日志服务收集SpringBoot日志案例

第一步&#xff1a;准备docker-compose文件 首先准备 docker-compose.yaml 文件 version: "3" services:elasticsearch:image: elasticsearch:7.17.2container_name: elasticsearch-servernetworks:- hostenvironment:- "cluster.nameelasticsearch" #设…

NeRF原理学习

一个2020年的工作我现在才来学习并总结它的原理&#xff0c;颇有种“时过境迁”的感觉。这篇总结是基于NeRF原文 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 阅读理解后写的&#xff0c;作用是以后如果记不太清了可以回忆。 目的&应用 先说…