MySQL之约束和表的增删查改

article/2025/7/14 8:02:07

MySQL之约束和表的增删查改

  • 一.数据库约束
    • 1.1数据库约束的概念
    • 1.2NOT NULL 非空约束
    • 1.3DEFAULT 默认约束
    • 1.4唯一约束
    • 1.5主键约束和自增约束
    • 1.6自增约束
    • 1.7外键约束
    • 1.8CHECK约束
  • 二.表的增删查改
    • 2.1Create创建
    • 2.2Retrieve读取
    • 2.3Update更新
    • 2.4Delete删除和Truncate截断

一.数据库约束

1.1数据库约束的概念

C++中对于我们定义的数据有着一套检查的逻辑,当数据不符合你数据类型的范围时就会产生报错那么MySQL中是否也有这种设计呢?C++中对于数据的检查一般是编译器自己进行产生报错而MySQL则会通过约束来让强制程序员自己合法插入数据。
数据库约束是指对数据库表中的数据所施加的规则或条件,⽤于确保数据的准确性和可靠性。这
些约束可以是基于数据类型、值范围、唯⼀性、⾮空等规则,以确保数据的正确性和相容性。简单来说约束类似于我们的法律法规来让我们程序员自己遵守,只要不违反这个规定MySQL就不会发出警告。
例如我们之前介绍MySQL中数据类型时提到过不同类型的取值范围这就算是一种约束,只要我们插入的数据不符合这个范围MySQL也会发出警告。

1.2NOT NULL 非空约束

对于某些数据将其设为空是没有意义所以我们可以使用非空约束来让其不可能为空。
例如对于学生来说他的名字学号身份证这些都不可能为空,也不会将其设为空因为这样就没有意义了。
在这里插入图片描述
从图片中我们也可以发现想要对某列加约束的话我们只需要在创建表时在列后增加关键字即可,非空约束就是not null。
想要判断表中某列是否可以为空我们只需要使用desc来查看表结构其中的NULL为yes则说明可以为空no就是不可以。

1.3DEFAULT 默认约束

我们同样可以为一列增加一个默认值类似于我们C++中的缺省参数,只要我们不显式设置列的值那么它就是默认值。
在这里插入图片描述

1.4唯一约束

对于数据来说我们有时候需要它是不重复的所以我们也可以将一个列增加唯一约束。这时候这列就被叫做唯一键。
在这里插入图片描述

1.5主键约束和自增约束

对于一个表来说我们有时候对于存储的数据我们是有轻重之分的,有些数据是这个表中最重要的数据例如学生表中的学号,即使其他的数据都为空工作人员也可以通过学号来找到一个学生。有些数据的存在又是比较无所谓的就像学生表中学生的爱好,这些数据就算不存在也不会影响什么。所以这些重要的数据我们需要来特别关注不能让它重复也不能为空,这就是主键。
主键约束用来标明一张表中的每条记录,主键既不能为空也不能重复并且一个表中只能有一个主键而主键可以由一列或者多列组成。
在这里插入图片描述
主键同样可以设为多列此时只要多列的内容不是完全相同则不算是重复,但是多列中每一个的内容都不可以为空。
在这里插入图片描述
一个表中只能有一个主键
在这里插入图片描述

1.6自增约束

因为主键是用来标识表中的每个记录所以它一般搭配则自增约束来使用,它允许数据库自动为新插入行的特定列生成一个唯一的数字。这通常用于主键列,以确保每条记录都有一个唯一的标识符。
因为只有数字可以自增所以自增列必须是整数类型并且只能用于键列即唯一键,主键或者外键同时一个表中只能设置一个自增列。
在这里插入图片描述
在一个键列被设为自增后我们仍然可以主动去设置它的值不过之后会在你设置的值的基础上进行自增。我们可以使用show create table table_name 来查看这个表的创建语句以及此时它的自增值是多少
在这里插入图片描述
在这里插入图片描述

1.7外键约束

人与人之间是有联系的同理表与表之间也是有联系的例如我是二班的学生那么这里就会有两个表一个为班级表一个是二班的成员表。那么这两个表不就形成了一种主从关系,主表是班级表而从表就是各班的成员表也可以说从表是对主表中对应内容的扩展。所以主表和从表中可以通过两表中各自的一列建立联系就像班级表中的班级编号和成员表中的班级编号。
在这里插入图片描述
在这里插入图片描述
但是我们可以将从表中班级编号设为空来插入行
在这里插入图片描述

所以在使用外键约束时我们需要注意:

  1. 主表和从表对应的列数据类型必须相同
  2. 在从表插入行时外键列的值必须在主表中存在或者为空
  3. 在删除主表中某行时从表不能存在对这行的引用
  4. 删除主表前必须删除从表

1.8CHECK约束

可以应⽤于⼀个或多个列,⽤于限制列中可接受的数据值,从⽽确保数据的完整性和准确性。
在这里插入图片描述

二.表的增删查改

对数据库中表的内容做操作一般被分为四类:Create,Retrieve,Update,Delete,简称CRUD。

2.1Create创建

insert 
[into]
table_name #表名
[(column [,column],...)] #是否指定列
values (vast_list) [,(vast_list)],...#插入的数据以行为单位vast_list: value[,value] ...

对于使用insert插入行我们可以完成单行数据全列插入,单行数据指定列插入以及多行数据指定列插入。

  1. 单行数据全列插入
    在这里插入图片描述

  2. 单行数据指定列插入
    使用单行指定列插入时要注意没有被插入的列是否有非空约束或者主键约束以免出现报错
    在这里插入图片描述

  3. 多行数据指定列插入
    使用多行数据指定列插入时要注意每行的数据要用()各自包裹起来。
    在这里插入图片描述

2.2Retrieve读取

SELECT[DISTINCT] #是否去重select_expr [, select_expr] ... #读取的列[FROM table_references] #是否从某个表中读取[WHERE where_condition] #是否有判断条件[GROUP BY {col_name | expr}, ...] #是否进行分表[HAVING where_condition] #在完成读取后是否再进行条件判断[ORDER BY {col_name | expr } [ASC | DESC], ... ] #是否进行排序[LIMIT {[offset,] row_count | row_count OFFSET offset}] #限制返回记录数量

在了解了语法后我们从简单的开始慢慢入手,用例子来为大家讲解语法中各个字段的作用
首先是最简单的查询,我们可以完成全列查询或者指定列查询亦或者我们可以查询一个表达式的结果。

  1. 全列查询
    在这里插入图片描述
  2. 指定列查询
    在这里插入图片描述
  3. 查询表达式结果
    在这里插入图片描述
    这其中chinese+10就算是一个表达式,有了这项特性我们就可以利用这些零碎的数据来完成需求例如我们想要知道总分。
    在这里插入图片描述
    但是我们发现chinese+math+english的可读性也太差了所以我们还可以将这个表达式修改名称。
    在这里插入图片描述

这就是最基础的查询工作接下来我们融合哪些可选性的字段来对查询进行升级

  1. [DISTINCT] #是否去重
    我们可以使用distinct来在查询的时候完成对表的去重
    在这里插入图片描述
    在使用math的时候要注意只要表中有任何一列的内容是不重复的那就不会被去重,同时我也希望大家可以理解表这个概念,表不但指存储在磁盘中数据库文件中的表文件,在MySQL中一切都是表都可以当做表比如我们完成查询后输出的内容也是一个表只不过我们可以将其分为逻辑表以及存储表。对表的理解会影响到后续我们对复合查询以及内外连接的理解。

  2. [WHERE where_condition] #是否有判断条件
    MySQL中我们一样可以在查询时进行条件判断来完成对数据的筛选工作,既然有判断功能那么我们就需要使用运算符,其中被分为两种:比较运算符和逻辑运算符。同时我们搭配例子来给大家说明
    比较运算符:

运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,对于NULL的比较不安全,比如NULL=NULL的结果一样为NULL
<=>等于,对于NULL的比较是安全的,比如NULL <=>NULL的结果是TRUE
!=,<>不等于
value BETWEEN a0AND a1范围匹配,[a0, a1],如果a0 <= value <= a1,返回TRUE或1,NOT BETWEEN则取反
value IN (option, …如果value 在optoin列表中,则返回TRUE(1),NOT IN则取反
IS NULL是NULL
IS NOT NULL不是NULL
LIKE模糊匹配,%表示任意多个字符包括零个,_表示任意一个字符,NOT LIKE则取反
#英语成绩大于60分
mysql> select * from exam where english > 60; 
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    2 | 孙悟空    |      87 |   78 |      77 |
|    3 | 猪悟能    |      88 |   98 |      90 |
|    4 | 曹孟德    |      82 |   84 |      67 |
|    6 | 孙权      |      70 |   73 |      78 |
+------+-----------+---------+------+---------+
4 rows in set (0.00 sec)#语文成绩大于英语成绩
mysql> select * from exam where chinese > english; 
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    1 | 唐三藏    |      67 |   98 |      56 |
|    2 | 孙悟空    |      87 |   78 |      77 |
|    4 | 曹孟德    |      82 |   84 |      67 |
|    5 | 刘⽞德    |      55 |   85 |      45 |
|    7 | 宋公明    |      75 |   65 |      30 |
+------+-----------+---------+------+---------+
5 rows in set (0.00 sec)#总分大于200分
mysql> select id,name,chinese+math+english total from exam where chinese+math+english > 200; 
+------+-----------+-------+
| id   | name      | total |
+------+-----------+-------+
|    1 | 唐三藏    |   221 |
|    2 | 孙悟空    |   242 |
|    3 | 猪悟能    |   276 |
|    4 | 曹孟德    |   233 |
|    6 | 孙权      |   221 |
+------+-----------+-------+
5 rows in set (0.00 sec)
#注意:虽然我们给chinese+math+english重命名为total了但是这是在我们查询完成后输出表结构时完成的
#而where判断是在查询过程中进行的此时重命名并没有完成,所以我们仍然只能使用chinese+math+english来代表总分#语文成绩在60到80分之间
mysql> select id,name,chinese from exam where chinese between 60 and 80;
+------+-----------+---------+
| id   | name      | chinese |
+------+-----------+---------+
|    1 | 唐三藏    |      67 |
|    6 | 孙权      |      70 |
|    7 | 宋公明    |      75 |
+------+-----------+---------+
3 rows in set (0.00 sec)#语文成绩在67,70,71,72,73中任意一个
mysql> select id,name,chinese from exam where chinese in (67,70,71,72,73);
+------+-----------+---------+
| id   | name      | chinese |
+------+-----------+---------+
|    1 | 唐三藏    |      67 |
|    6 | 孙权      |      70 |
+------+-----------+---------+
2 rows in set (0.00 sec)#名字是孙某某,某某可以是零个字也可以是一个两个多个
mysql> select id,name from exam where name like '孙%';
+------+-----------+
| id   | name      |
+------+-----------+
|    2 | 孙悟空    |
|    6 | 孙权      |
+------+-----------+
2 rows in set (0.00 sec)#名字是孙某,某只能是一个字
mysql> select id,name from exam where name like '孙_';
+------+--------+
| id   | name   |
+------+--------+
|    6 | 孙权   |
+------+--------+
1 row in set (0.00 sec)

逻辑运算符:

运算符说明
AND多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR任意一个条件为TRUE,结果都是TRUE
NOT条件为TRUE,结果为FALSE
#语文和英语成绩都大于80
mysql> select id,name,chinese,english from exam where chinese >80 and english > 80;
+------+-----------+---------+---------+
| id   | name      | chinese | english |
+------+-----------+---------+---------+
|    3 | 猪悟能    |      88 |      90 |
+------+-----------+---------+---------+
1 row in set (0.00 sec)#语文或者英语成绩大于80
mysql> select id,name,chinese,english from exam where chinese >80 or english > 80;
+------+-----------+---------+---------+
| id   | name      | chinese | english |
+------+-----------+---------+---------+
|    2 | 孙悟空    |      87 |      77 |
|    3 | 猪悟能    |      88 |      90 |
|    4 | 曹孟德    |      82 |      67 |
+------+-----------+---------+---------+
3 rows in set (0.00 sec)#语文成绩不大于80
mysql> select id,name,chinese,english from exam where  not chinese >80 ;
+------+-----------+---------+---------+
| id   | name      | chinese | english |
+------+-----------+---------+---------+
|    1 | 唐三藏    |      67 |      56 |
|    5 | 刘⽞德    |      55 |      45 |
|    6 | 孙权      |      70 |      78 |
|    7 | 宋公明    |      75 |      30 |
+------+-----------+---------+---------+
4 rows in set (0.00 sec)
  1. [HAVING where_condition] #在完成读取后是否再进行条件判断
    在where中我们提到过where是在查询过程中进行条件判断而having则是在查询完成后再进行条件判断,除了这方面不同例如运算符什么的都是相同的使用方式。
#总分超过200
#由于是在查询完成后进行判断所以having就可以使用列的别名来进行条件判断
mysql> select id,name,chinese+math+english total from exam having total > 200;
+------+-----------+-------+
| id   | name      | total |
+------+-----------+-------+
|    1 | 唐三藏    |   221 |
|    2 | 孙悟空    |   242 |
|    3 | 猪悟能    |   276 |
|    4 | 曹孟德    |   233 |
|    6 | 孙权      |   221 |
+------+-----------+-------+
5 rows in set (0.00 sec)
  1. [ORDER BY {col_name | expr } [ASC | DESC], … ] #是否进行排序
    想要进行排序时我们需要指出你想要进行排序的列并且也可以选择是升序还是降序,其中ASC是升序,DESC是降序。MySQL默认是进行升序排序
#默认是升序
mysql> select * from exam  order by chinese;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    5 | 刘⽞德    |      55 |   85 |      45 |
|    1 | 唐三藏    |      67 |   98 |      56 |
|    6 | 孙权      |      70 |   73 |      78 |
|    7 | 宋公明    |      75 |   65 |      30 |
|    4 | 曹孟德    |      82 |   84 |      67 |
|    2 | 孙悟空    |      87 |   78 |      77 |
|    3 | 猪悟能    |      88 |   98 |      90 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)#显式升序
mysql> select * from exam  order by chinese asc;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    5 | 刘⽞德    |      55 |   85 |      45 |
|    1 | 唐三藏    |      67 |   98 |      56 |
|    6 | 孙权      |      70 |   73 |      78 |
|    7 | 宋公明    |      75 |   65 |      30 |
|    4 | 曹孟德    |      82 |   84 |      67 |
|    2 | 孙悟空    |      87 |   78 |      77 |
|    3 | 猪悟能    |      88 |   98 |      90 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)#降序
mysql> select * from exam  order by chinese desc;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    3 | 猪悟能    |      88 |   98 |      90 |
|    2 | 孙悟空    |      87 |   78 |      77 |
|    4 | 曹孟德    |      82 |   84 |      67 |
|    7 | 宋公明    |      75 |   65 |      30 |
|    6 | 孙权      |      70 |   73 |      78 |
|    1 | 唐三藏    |      67 |   98 |      56 |
|    5 | 刘⽞德    |      55 |   85 |      45 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)#总成绩降序
mysql> select id,name,chinese+math+english total from exam order by total desc;
+------+-----------+-------+
| id   | name      | total |
+------+-----------+-------+
|    3 | 猪悟能    |   276 |
|    2 | 孙悟空    |   242 |
|    4 | 曹孟德    |   233 |
|    1 | 唐三藏    |   221 |
|    6 | 孙权      |   221 |
|    5 | 刘⽞德    |   185 |
|    7 | 宋公明    |   170 |
+------+-----------+-------+
7 rows in set (0.00 sec)
#为什么这里我们又可以使用别名(给列重命名就是取别名)来进行排序了呢?
#这是因为排序是在查询之后完成的这时候别名也已经取好了自然可以使用了
  1. [LIMIT {[offset,] row_count | row_count OFFSET offset}] #限制返回记录数量
    我们可以在查询完成后限制输出表的行数以及从哪行开始输出,直接上例子
#从0开始显式五行
mysql> select * from exam limit 5;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    1 | 唐三藏    |      67 |   98 |      56 |
|    2 | 孙悟空    |      87 |   78 |      77 |
|    3 | 猪悟能    |      88 |   98 |      90 |
|    4 | 曹孟德    |      82 |   84 |      67 |
|    5 | 刘⽞德    |      55 |   85 |      45 |
+------+-----------+---------+------+---------+
5 rows in set (0.00 sec)#从2开始显示5行
#注意:表结构的行数是从0开始算的
mysql> select * from exam limit 2,5;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    3 | 猪悟能    |      88 |   98 |      90 |
|    4 | 曹孟德    |      82 |   84 |      67 |
|    5 | 刘⽞德    |      55 |   85 |      45 |
|    6 | 孙权      |      70 |   73 |      78 |
|    7 | 宋公明    |      75 |   65 |      30 |
+------+-----------+---------+------+---------+
5 rows in set (0.00 sec)#从5开始显示两行
mysql> select * from exam limit 2 offset 5;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    6 | 孙权      |      70 |   73 |      78 |
|    7 | 宋公明    |      75 |   65 |      30 |
+------+-----------+---------+------+---------+
2 rows in set (0.00 sec)
  1. [GROUP BY {col_name | expr}, …] #是否进行分表
    在日常中我们可能面临一些数据是可以根据某列划分成不同的组的,例如我们在工作中不同的部门学校中不同的班级都是这种情况。所以group by通常是被叫做分组但是大家还记得我之前说的MySQL中一切都是表所以我觉得分表更加好理解,大家可以将其理解成根据某列将一个大表划分成几个小表但是它还是个表。
mysql> select * from emp;
+----+-----------+--------+------------+
| id | name      | role   | salary     |
+----+-----------+--------+------------+
|  1 | 马云      | 老板   | 1500000.00 |
|  2 | 马化腾    | 老板   | 1300000.00 |
|  3 | 张三      | 经理   |   13000.00 |
|  4 | 赵四      | 经理   |   11000.00 |
|  5 | 王五      | 员工   |    5000.00 |
|  6 | 田七      | 员工   |    6000.00 |
|  7 | 路人甲    | 保安   |    2000.00 |
|  8 | 路人乙    | 保安   |    2000.00 |
+----+-----------+--------+------------+
8 rows in set (0.00 sec)#根据role来进行分表
mysql> select role from emp group by role;
+--------+
| role   |
+--------+
| 老板   |
| 经理   |
| 员工   |
| 保安   |
+--------+
4 rows in set (0.00 sec)#根据role分表后我们还可以通过聚合函数来对分表进行处理
mysql> select role,count(*) from emp group by role;
+--------+----------+
| role   | count(*) |
+--------+----------+
| 老板   |        2 |
| 经理   |        2 |
| 员工   |        2 |
| 保安   |        2 |
+--------+----------+
4 rows in set (0.00 sec)mysql> select role,max(salary),min(salary),avg(salary) from emp group by role;
+--------+-------------+-------------+----------------+
| role   | max(salary) | min(salary) | avg(salary)    |
+--------+-------------+-------------+----------------+
| 老板   |  1500000.00 |  1300000.00 | 1400000.000000 |
| 经理   |    13000.00 |    11000.00 |   12000.000000 |
| 员工   |     6000.00 |     5000.00 |    5500.000000 |
| 保安   |     2000.00 |     2000.00 |    2000.000000 |
+--------+-------------+-------------+----------------+
4 rows in set (0.00 sec)

2.3Update更新

UPDATE 
[LOW_PRIORITY] #是否将updata设为低优先级操作
[IGNORE] #是否忽略遇到不可重复键时的错误
table_reference #表的名称SET assignment [, assignment] ... #更新的内容[WHERE where_condition] #是否进行条件判断[ORDER BY ...] #是否进行排序[LIMIT row_count] #是否控制输出的内容

我们先举一些简单的例子来让大家知道怎么使用updata再讲解其中的比较重要的可选项。

mysql> select * from exam;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    1 | 唐三藏    |      67 |   98 |      56 |
|    2 | 孙悟空    |      87 |   78 |      77 |
|    3 | 猪悟能    |      88 |   98 |      90 |
|    4 | 曹孟德    |      82 |   84 |      67 |
|    5 | 刘⽞德    |      55 |   85 |      45 |
|    6 | 孙权      |      70 |   73 |      78 |
|    7 | 宋公明    |      75 |   65 |      30 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)//给孙悟空的语文更新为30分
mysql> update exam set chinese = 30 where name = '孙悟空';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from exam where name = '孙悟空';
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    2 | 孙悟空    |      30 |   78 |      77 |
+------+-----------+---------+------+---------+
1 row in set (0.00 sec)//给曹孟德的英语更新为60数学更新为70
mysql> update exam set english = 60,math = 70 where name = '曹孟德';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from exam where name = '曹孟德';
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    4 | 曹孟德    |      82 |   70 |      60 |
+------+-----------+---------+------+---------+
1 row in set (0.00 sec)mysql> select id,name,math,chinese+math+english total from exam order by chinese+math+english asc;
+------+-----------+------+-------+
| id   | name      | math | total |
+------+-----------+------+-------+
|    5 | 刘⽞德    |  115 |   215 |
|    1 | 唐三藏    |   98 |   221 |
|    6 | 孙权      |   73 |   221 |
|    7 | 宋公明    |  125 |   230 |
|    4 | 曹孟德    |  100 |   242 |
|    2 | 孙悟空    |  138 |   245 |
|    3 | 猪悟能    |   98 |   276 |
+------+-----------+------+-------+
7 rows in set (0.00 sec)//给总分最低的三名数学各加30分
mysql> update exam set math =math + 30 where chinese+math+english is not null order by chinese+math+english  asc limit 3;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0mysql> select id,name,math,chinese+math+english total from exam order by chinese+math+english asc;
+------+-----------+------+-------+
| id   | name      | math | total |
+------+-----------+------+-------+
|    7 | 宋公明    |  125 |   230 |
|    4 | 曹孟德    |  100 |   242 |
|    2 | 孙悟空    |  138 |   245 |
|    5 | 刘⽞德    |  145 |   245 |
|    1 | 唐三藏    |  128 |   251 |
|    6 | 孙权      |  103 |   251 |
|    3 | 猪悟能    |   98 |   276 |
+------+-----------+------+-------+
7 rows in set (0.00 sec)

要注意在使用update时更新数据不能使用math += 30这种语法只能使用math = math + 30。并且我们使用update的时候一般都是需要搭配where来进行条件判断的不然更新就会造成全列数据的改变所以要更新数据要慎重。

update的使用比较简单但是它的两个可选项是需要我们说一下的。

  1. [LOW_PRIORITY]
    这个可选项是是否将update以低优先度的方式进行,想要理解这个概念我们就需要先知道MySQL中优先度是如何进行设计的。从我们C++的经验中有优先级一般我们都会涉及到锁的概念所以在MySQL中也不例外,当我们进行CURD时需要SQL先申请锁申请成功之后才能进行操作否则就需要等待。如果我们不设置锁让CURD随意进行那么在高并发的情况下MySQL写入和读取数据就会变得很混乱可能此时我读取的数据是这个但是实际并不是这样的因为被其他人修改了,所以我们需要锁来完成MySQL中语句的调度。
    那么我们可以使用读写者模型来对表的增删查改进行分类,我们将select也就是读取作为读取者,而insert,update和delete都是写入者。MySQL中默认的调度是这样的:写入操作优先级大于读取操作,写入操作在同一时刻只能发生一次并且写入请求需要按时间来进行排队,读取操作在可以多个同时进行的。而low_priority则是MySQL提供的更改调度策略的字段,在update后添加low_priority后就会将其的优先度调整的比读取操作低这就会导致如果一直有读取操作在进行因为update的优先度低所以它必须等所有的读取操作完成后才能进行也就是将update阻塞住了。
  2. [IGNORE]
    这个可选项的作用是防止遇到不可重复键时的错误,我们知道表中有些列是不可重复键例如主键,唯一键,正常当我们使用update更新表中的数据时我们更新的数据如果原来的数据是重复的就会发生报错此时我们在update后添加IGNORE就会避免这个报错的产生。

2.4Delete删除和Truncate截断

DELETE 
FROM 
tbl_name #表名
[WHERE where_condition] #是否进行条件判断
[ORDER BY ...] #是否进行排序
[LIMIT row_count] #是否进行输出内容的控制

删除我就不进行演示了只是大家要注意如果我们不加条件判断就会将整个表的数据删除了所以无论是更新还是删除大家都最好加上where以防出现无法挽回的情况。

TRUNCATE [TABLE] tbl_name

截断和删除不同截断只能对整个表进行它无法进行条件判断从而对某行来进行。不仅如此截断还有和删除不同的地方,我直接给大家上例子

mysql> select * from student;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 张三   |   17 |
|  2 | 李四   |   18 |
|  3 | 王五   |   18 |
|  4 | 赵六   |   16 |
|  5 | 田七   |   16 |
|  6 | 刘八   |   16 |
|  7 | 杨九   |   16 |
+----+--------+------+
7 rows in set (0.00 sec)mysql> show create table student\G;
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (`id` bigint NOT NULL AUTO_INCREMENT,`name` char(8) NOT NULL,`age` int DEFAULT '16',PRIMARY KEY (`id`),CONSTRAINT `student_chk_1` CHECK ((`age` >= 16))
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)mysql> delete from student;
Query OK, 7 rows affected (0.01 sec)mysql> show create table student\G;
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (`id` bigint NOT NULL AUTO_INCREMENT,`name` char(8) NOT NULL,`age` int DEFAULT '16',PRIMARY KEY (`id`),CONSTRAINT `student_chk_1` CHECK ((`age` >= 16))
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)mysql> insert into student (name) values('张三'),('李四');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select * from student;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  8 | 张三   |   16 |
|  9 | 李四   |   16 |
+----+--------+------+
2 rows in set (0.00 sec)

大家现在把关注点转移到表的创建语句中我们可以发现在使用delete删除表的数据后表的auto_increment也就是自增值是没有被清零的这点我们在上面讲自增约束的时候也提到过。现在我们去看看truncate的情况。

mysql> show create table student\G;
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (`id` bigint NOT NULL AUTO_INCREMENT,`name` char(8) NOT NULL,`age` int DEFAULT '16',PRIMARY KEY (`id`),CONSTRAINT `student_chk_1` CHECK ((`age` >= 16))
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)ERROR: 
No query specifiedmysql> select * from student;
Empty set (0.01 sec)mysql> insert into student (name) values('张三'),('李四');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select * from student;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  8 | 张三   |   16 |
|  9 | 李四   |   16 |
+----+--------+------+
2 rows in set (0.00 sec)mysql> truncate table student;
Query OK, 0 rows affected (0.02 sec)mysql> select * from student;
Empty set (0.00 sec)mysql> show create table student\G;
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (`id` bigint NOT NULL AUTO_INCREMENT,`name` char(8) NOT NULL,`age` int DEFAULT '16',PRIMARY KEY (`id`),CONSTRAINT `student_chk_1` CHECK ((`age` >= 16))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)mysql> insert into student (name) values('张三'),('李四');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select * from student;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 张三   |   16 |
|  2 | 李四   |   16 |
+----+--------+------+
2 rows in set (0.00 sec)

大家可以发现在我们截断了表后不光表的数据被清空了表的自增值一样被清空了变成从零开始了。并且TRUNCATE命令通常比DELETE命令更快,因为它不记录单个行的删除操作。DELETE命令会为表中的每一行生成一个删除操作,而TRUNCATE命令则一次性删除表中的所有数据,因此执行速度更快。


http://www.hkcw.cn/article/qwcggOgJNk.shtml

相关文章

在线制作幼教早教行业自适应网站教程

你想知道怎么做自适应网站吗&#xff1f;今天就来教你在线用模板做个幼教早教行业的网站哦。 首先得了解啥是自适应网站。简单说呢&#xff0c;自适应网站就是能自动匹配不同终端设备的网站&#xff0c;像手机、平板、电脑等。那如何做幼早教自适应网站呢&#xff1f; 在乔拓云…

[特殊字符] 超强 Web React版 PDF 阅读器!支持分页、缩放、旋转、全屏、懒加载、缩略图!

在现代 Web 项目中&#xff0c;PDF 浏览是一个常见需求&#xff1a;从政务公文到合同协议&#xff0c;PDF 文件无处不在。但很多方案要么体验不佳&#xff0c;要么集成复杂。今天&#xff0c;我给大家带来一个开箱即用、功能全面的 PDF 预览组件 —— [PDFView](https://www.np…

裂缝仪在线监测装置:工程安全领域的“实时守卫者”

在基础设施运维领域&#xff0c;裂缝扩展是威胁建筑结构安全的核心隐患之一。传统人工巡检方式存在效率低、时效性差、数据主观性强等局限&#xff0c;而裂缝仪在线监测装置通过技术迭代&#xff0c;实现了对结构裂缝的自动化、持续性追踪&#xff0c;为工程安全评估提供科学依…

语音通信接通率、应答率和转化率有什么区别?

语音通信中的接通率、应答率和转化率是三个不同的关键指标&#xff0c;它们各自具有独特的定义和衡量标准&#xff0c;以下是它们之间的区别&#xff1a; 一、定义 1. 接通率&#xff1a; • 是指成功接通的电话数量占总拨打电话数量的百分比。具体来说&#xff0c;只要被叫响…

俄称击落千余架乌军无人机 乌称击退俄28次进攻

当地时间5月30日,俄罗斯国防部发布战报称,在过去一周里,俄军对乌境内的国防工业设施、军用机场基础设施、武器弹药储存设施等目标实施打击。俄军在苏梅、哈尔科夫、顿涅茨克等方向打退乌军多次进攻并发动攻势。俄防空部队击落乌军1439架固定翼无人机。此外,俄军控制了苏梅、…

阿富汗今年已有357人死于麻疹 大部分是儿童

据世界卫生组织报告显示,截至5月25日,阿富汗今年已记录了超过55000例麻疹疑似病例,其中已有357人死亡,死者大部分是儿童。当地医务系统专家认为,疫苗缺乏和营养不足是疾病快速传播的重要原因。目前阿富汗有1580万人吃不饱饭,大量儿童营养不良,难以抵御疾病侵袭,需要获得…

从双向奔赴到分道扬镳 “马特”组合缘何分手

当地时间5月30日,美国总统特朗普和美国企业家、政府效率部负责人埃隆马斯克在白宫举行新闻发布会。这是马斯克在政府效率部的最后一天。马斯克28日在社交媒体上说,他即将离开特朗普政府,不再继续担任“特别政府雇员”一职。这也意味着,马斯克在1月20日就任美国政府效率部负…

Form开发指南-第一弹:开发背景与基础环境

1 用户和常用工具 1.1 区分3类用户 OS用户&#xff1a;包括超级用户root&#xff0c;应用OS用户如applprod&#xff0c;数据库OS用户oraprod。数据库用户&#xff1a;包括内置管理用户sys、system&#xff0c;EBS用户apps&#xff0c;EBS各模块用户applys、gl、inv、po、ar、…

基于LBS的上门代厨APP开发全流程解析

上门做饭将会取代外卖行业成为新一轮的创业风口吗&#xff1f;杭州一位女士的3菜一汤88元套餐引爆社交网络&#xff0c;这个包含做饭、洗碗、收拾厨房的全套服务&#xff0c;正在重新定义"到家经济"的边界。当25岁的研究生系着围裙出现在客户厨房&#xff0c;当年轻姑…

Bootstrap项目 - 个人作品与成就展示网站

文章目录 前言一、项目整体概述1. 项目功能介绍1.1 导航栏1.2 首页模块1.3 关于我模块1.4 技能模块1.5 作品模块1.6 成就模块1.7 博客模块1.8 联系我模块 2. 技术选型说明 二、项目成果展示1. PC端展示1.1 首页1.2 关于我1.3 技能1.4 作品1.5 成就1.6 博客1.7 联系我 2. 移动端…

QML 滑动与翻转效果(Flickable与Flipable)

目录 引言相关阅读核心组件解析Flickable基础属性Flipable核心特性 示例解析示例1&#xff1a;可滑动列表&#xff08;FlickableDemo&#xff09;示例2&#xff1a;可翻转卡片&#xff08;FlipableCard&#xff09; 总结下载链接 引言 Qt Quick 框架提供的 Flickable 与 Flipa…

氮气吹扫电磁阀

一、氮气吹扫电磁阀的概述 氮气吹扫电磁阀是一种重要的工业自动控制设备&#xff0c;用于对工业设备中出现的杂质和沉淀物进行清理&#xff0c;以保证生产线的畅通和生产效率的稳定。其作用是在需要吹扫清洗的工业设备中&#xff0c;通过控制气源的气压&#xff0c;打开电磁阀…

【香港科大+华为诺亚方舟】Web Reconstruction方法:从原始网页文档合成高质量指令遵循数据,效果显著,代码开源

论文名称&#xff1a;Instruction-Tuning Data Synthesis from Scratch via Web Reconstruction 论文链接&#xff1a;https://arxiv.org/abs/2504.15573 机构&#xff1a;香港科技大学 华为诺亚方舟实验室 Github代码链接&#xff1a;https://github.com/YJiangcm/WebR 个人文…

星际巡航-第16届蓝桥第6次STEMA测评Scratch真题第4题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥真题&#xff0c;这是Scratch蓝桥真题解析第233讲。 第16届蓝桥第6次STEMA测评已于2025年4月13日落下帷幕&#xff0c;编程题一共有5题&#xff08;初级组只有前4道编…

C++17新特性 类型推导

在传统C和C中&#xff0c;参数的类型都必须明确定义&#xff0c;这其实对我们快速进行编码没有任何帮助&#xff0c;尤 其是当我们面对一大堆复杂的模板类型时&#xff0c;必须明确的指出变量的类型才能进行后续的编码&#xff0c;这不仅拖 慢我们的开发效率&#xff0c;也让代…

leetcode 2359. 找到离给定两个节点最近的节点

给你一个 n 个节点的 有向图 &#xff0c;节点编号为 0 到 n - 1 &#xff0c;每个节点 至多 有一条出边。 有向图用大小为 n 下标从 0 开始的数组 edges 表示&#xff0c;表示节点 i 有一条有向边指向 edges[i] 。如果节点 i 没有出边&#xff0c;那么 edges[i] -1 。 同时…

Qt creator 设计页面控件认识与了解

记录一下 Qt 中的认识与了解&#xff1a; 在 Qt 中&#xff0c;这些功能属于 Qt Designer 的组件过滤系统&#xff0c;旨在帮助开发者在对象浏览器中快速定位和使用不同类型的控件和组件。以下是每个功能的详细讲解&#xff1a; ‌Layouts&#xff08;布局&#xff09;‌&…

[网页五子棋][对战模块]前后端交互接口(建立连接、连接响应、落子请求/响应),客户端开发(实现棋盘/棋子绘制)

文章目录 约定前后端交互接口建立连接建立连接响应针对"落子"的请求和响应 客户端开发实现棋盘/棋子绘制部分逻辑解释 约定前后端交互接口 对战模块和匹配模块使用的是两套逻辑&#xff0c;使用不同的 websocket 的路径进行处理&#xff0c;做到更好的耦合 建立连接 …

Redisson学习专栏(三):高级特性与实战(Spring/Spring Boot 集成,响应式编程,分布式服务,性能优化)

文章目录 前言一、Spring Boot深度整合实战1.1 分布式缓存管理1.2 声明式缓存1.3 响应式编程 二、分布式服务治理2.1 服务端实现2.2 客户端调用2.3 高级特性2.4 服务治理功能 三、分布式任务调度引擎四、连接池配置与网络参数调优4.1 连接池配置4.2 网络参数调优4.3 集群模式特…

行程规划:智能规划,轻松旅行

在旅行中&#xff0c;一个好的行程规划是成功旅行的关键。它不仅能帮助你合理安排时间&#xff0c;还能让你的旅行更加经济、高效。成都为普云科技有限公司推出的“行程规划”APP&#xff0c;就是这样一个贴心的旅行助手。它不仅能让你自由记录旅游路线&#xff0c;还能实时记账…