MySQL表的增删改查(CRUD3约束)

这次我们开始先不复习嗷,等到把数据表的删除说完咱们统一,总结书写

1.数据表的删除:

语法:

1. 使用 DROP TABLE 语句删除单个表

  • 基本语法DROP TABLE [IF EXISTS] table_name;
    • table_name是要删除的表的名称。
    • IF EXISTS是可选的。如果指定了IF EXISTS,当要删除的表不存在时,MySQL 不会抛出错误,而是发出一个提示。
  • 示例
    • 假设要删除名为student的表,可以使用DROP TABLE students;
    • 如果不确定students表是否存在,为了避免报错,可以使用DROP TABLE IF EXISTS students;。例如在执行数据库清理脚本时,表可能已经被删除,使用IF EXISTS就很合适。

2. 删除多个表

  • 语法DROP TABLE [IF EXISTS] table_name1, table_name2, …;
  • 示例:如果要同时删除students表和teachers表,可以使用DROP TABLE students, teachers;。使用IF EXISTS的版本则是DROP TABLE IF EXISTS students, teachers;。这种方式在需要一次性清理多个相关或不相关表的场景下很有用,比如删除一个测试数据库中的所有临时表。

3. 涉及外键约束时的表删除

  • 如果要删除的表是其他表的外键关联表,有以下两种情况:
    • 先删除关联关系或其他相关表:可以先使用ALTER TABLE语句删除外键约束,或者先删除引用该表的其他表中的相关数据,然后再删除目标表。
    • 使用 CASCADE 选项(如果数据库支持):某些数据库管理系统支持在DROP TABLE语句中使用CASCADE选项来自动删除与该表相关的依赖对象(如外键约束等),但 MySQL 的标准DROP TABLE语句没有CASCADE选项用于处理外键。需要手动处理外键约束

注意:

删除 MySQL 数据表时一定要谨慎,因为这是一个不可逆的操作,数据一旦删除就无法恢复。在执行删除操作之前,建议先备份数据库或者相关表的数据。

delete的时候,如果不加where条件会出现什么问题?


如果删除时不加条件限制,那么整张表的数据都会被删除掉(清空)
非常危险的操作

但是数据是可以恢复的,每一条执行的SQL都会被记录到日志中,把日志中记录的操作,再执行一遍基本上就可以完成恢复
在生产环境中一般不去使用delete操作
一般在表中会加一个deletestate字段,用来表示这条记录是否删除,0表示正常(没有删除)1表示已删除用update操作去更新deleteState字段,就可以实现删除功能,这条被删除的数据并没有实质上删除掉而是始终存在与数据库

2.对数据表的总结:

1.新增-插入
insert into 表名[(列名[, 列名][,列名]..)] values (值[,值][, 值].);

# 插入时列名与值的个数--对应

2.查询操作
a.全列査询 select*from 表名;

#查询表中所有的列,如是不加条数限制,会把表中所有的记录全部都查出来
b.指定列査询 select 列名[, 列名],列名]... from 表名; 

# 按实际需要指定要查询的列
c.列名为表达式 select 列名/表达式 from 表名;

# 表达式可以是常量,也可以是多个列的运算


d.查询中使用别名 select 列名/表达式 as 别名 from 表名;

#as可以省略,别名可以是任意的字符串,如果字符串中包含空格,字符串用单引号引起来

e. 去重查询 select disctinct 列名[,列名],列名].. from 表名;

# 如果查询多个列,去重时,所有列都相同才被判定为两行数相同

f.排序 select* from 表名 order by列/表达式/别 asc|desc;

# asc 升序,小的在前,desc降序,大的在前
g.条件査询 select* from 表名 where 列名/表达式 比较|逻辑运算符 [order by子旬];

# where 中只能写列名或表达式,不能使用别名

h.区间查询 select * from 表名 where 列名 between 开始条(件 and 结東条件;

#等价与开始条件<=列名<= 结束条件,列名>=开始条件 AND 列名<=结束条件

i.模糊査询 select* from 表名 where 列名 like'%值 ;

# %可以匹配0个或任意多个字符, 只能匹配一个字符
j.分页查询 select* from 表名 [where 条件][order by 列名 asc|desc] limit num;

#查询结果集中从0开始的前num条数据
select* from 表名 [where 条件][order by 列名 asc|desc] limit start num;

#从第start条开始,向后取num条数据

select* from 表名 [where 条件] [order by 列名 asc|desc] limit num offset start;

#从第start条开始,向后取num条数据
3. 更新操作

如果不加where条件,那么会导致表中所有的记录都被更新,危险操作
update 表名 set 列名=值[, 列名=値][,列名=值]... where 条件 order by 列名 asc|desc limit n;
4.删除操作
如果不加where条件,那么会导致表中所有的记录都被删除,危险操作
delete from 表名 where 条件 order by 列名 ascldesc limit n;

3.数据库约束


数据库约束是关系型数据库的一个重要功能
主要作用是保证数据的完整性,也可能理解数据的正确性(数据本身是否正确,关联关系是否正确)数据库会帮我们做校验工作人工检查数据完整性的工作量非常的大,在数据表中定义一些约束,那么数据库写入数据的时候,
约束一般是指定在列上的

1. 非空约束(NOT NULL)

  • 定义:非空约束确保列中的值不能为空值。它强制列必须包含有效的数据。
  • NOT NULL-指示某列不能存储 NULL 值。

我们看第三行如果没有指定非空约束时,当前的列是可以写入一个NULL值的
如果要把某一列定义为一个必填项,那么就可以使用not null(非空)约束

我们在创建(数据表)时,可以直接添加表约束,让某一个数据不能为空,

当我在查看表结构时就会发现第三行的NULL中名字(NAME)为 NO

此时            NO 表示当前列不能为空 :表示必须有值
                   YES 表示当前列可以为空 : 不一定有值,可以为空


1.非空列有值时可以正常写入

2.写入数据时会报错,提示不能写入NULL值数据库帮我们做了一次校验

2. 唯一约束(UNIQUE)

  • 定义:唯一约束确保列或列的组合中的值在整个表中是唯一的。与主键不同,唯一约束列可以包含 NULL 值(但只能有一个 NULL,因为多个 NULL 被认为是相等的,违反唯一性)。
  • UNIQUE-保证某列的每行必须有唯一的值。
    某列的值在整个表中不能重复,比如说身份证号,学号

不加唯一约束的时候,可能出现编号相同,但是人名不同的情况不符合逻辑
创建一个在ID字段加唯一约束的表

我们可以看到当填加了唯一约束(UNIQUE)后,id为1的数据不能被第二次插入

3. DEFAULT-规定没有给列赋值时的默认值。

插入时只指定了ld,这时name列使用默认值填充
当为某列设置了默认约束的时候,如果不给这个列指定值才会使用默认值

虽然指定的默认约束,"但是当我们手动指定这一列的值为NULL时插入的值依然是NULL,因为这个NULL 是我们自己手动指定的,也可以理解为我们想要的值用户指定的优先级要高于默认约束

4.主键约束(PRIMARY KEY )是 NOT NULL和 UNIQUE的结合。

1. 主键定义
  • 主键(Primary Key)是数据库表中用于唯一每条标识记录的一列父母列的组合。
  • 主键中的值必须是唯一的,且不能为NULL。
  • 每个表只有一个主键。
2. 主键墩
  • 唯一性:主键列中的值必须唯一,不能重复。
  • 非空性:主键列不能包含NULL值,保证每行数据的完整性。
  • 自动索引:MySQL会自动在主键列上创建索引,这样可以加速数据查询。
  • 不可更改性:通常主键列的值不会修改,这是因为修改主键会涉及到大量的关联更新操作。
3. 定义主键的方法

MySQL中可以通过以下几种方式定义主键:

3.1 创建表时定义主键

在创建表时可以直接指定主键,语法如下:

例如

3.2 使用多列定义主键(复合主键)

当一张表的唯一性需要多个列一起保证时,可以创建一个复合主键:

3.3 使用ALTER TABLE语句添加主键

对于已存在的表,可以使用ALTER TABLE语句来添加主键:

ALTER TABLE 表名 ADD PRIMARY KEY (列名);

4. 删除主键

如果需要删除主键,可以使用ALTER TABLE语句删除:

ALTER TABLE 表名 DROP PRIMARY KEY;

例如

注意:删除主键后,如果表中的其他列仍需要唯一性和非空约束,则需要单独添加这些约束。

5.主键的自动增长(AUTO_INCRMENT)

主键通常与AUTO_INCREMENT属性结合使用,使主键自动递增。只有当主键为整数类型时,才可以使用AUTO_INCREMENT

这样,每次插入新记录时,id列会自动增加1。注意,一个表中只能有一个AUTO_INCREMENT列,且必须是主键或唯一键。

6. 主键和外键的关系

主键和外键通常一起使用以维护数据库的缺陷。外键引用另一个表中的主键,这样可以在不同的表之间建立关系。例如:

employees表中,dept_id是一个外键,引用了departments表中的dept_id主键。这就保证了employees表中的dept_id值在departments表中是存在的。

7. 主键的注意事项

  • 唯一性非空性:确保主键列没有重复和NULL值。
  • 性能问题:主键列通常不适合间隙更新,因为它是数据的唯一标识,更新会导致索引重建,影响性能。
  • 合适的数据类型:优先使用较小的整数类型(如INTBIGINT)作为速度主键,以减少存储空间并提高查询能力。

8.主键设计建议

  • 使用列主键:如果可能,尽量使用单一列主键(如自增单一的整数类型),避免使用复合主键,简化查询。
  • 自增主键:自增的整数主键可以简化插入操作,适用于大多数场景。
  • 不可变性:主键一旦设置,应尽量避免修改,以保证数据的一致性。

9.  博主总结

主键约束帮我们校验了非空和唯一,这两个校验在写入数据时对效率是有一定影响但是比起不做校验来说,这个性能消耗还是可以承担的而且主键对后面讲的索引起到了非常重要的作用

强烈建议为每张表定义一个主键

4. 外键约束(FOREIGN KEY)

  • 定义:外键用于建立两个表之间的关联。它定义了一个表中的列(或列组合)与另一个表中的主键(或唯一键)之间的引用关系。外键约束可以保证数据的参照完整性,即外键列的值必须是它所引用的表中主键列的值或者为 NULL。

1. 外键定义

  • 外键(Foreign Key)用于在表之间建立和保持关系。
  • 外键字段中的值必须是另一张表的主键或唯一键中存在的值。
  • 通过外键,可以在不同的表之间形成“父子关系”,保证数据之间的依赖性和一致性。

2. 外键特性

  • 引用缺陷:外键保证一个表中的数据在另一个表中有对应的值,防止出现“孤立”记录。
  • 约束数据操作:通过外键可以限制删除和更新操作,保证数据的正确性。
  • 级联操作:可以通过外键设置级联删除或更新规则,使得父表中的变化自动反映到子表中。

3. 定义外键的方法

在MySQL中,可以在创建表时直接定义外键,也可以通过ALTER TABLE语句为已存在的表添加外键。

3.1 创建表时定义外键

在创建表时直接定义外键,语法如下:

在这个例子中,employees表的dept_id列是一个外键,引用了departments表中的dept_id主键。这确保了在employees表中,每个dept_id都必须在departments表中存在。

3.2 使用ALTER TABLE添加外键

可以使用ALTER TABLE语句为已存在的表添加外键约束:

例如:

ALTER TABLE employees
ADD FOREIGN KEY (dept_id) REFERENCES departments(dept_id);

4.外键的级别操作

MySQL支持以下几种常见的级别联操作,用于在父表数据被修改或删除时对子表数据的处理:

  • ON DELETE CASCADE:当父表记录被删除时,自动删除子表中所有相关的记录。
  • ON DELETE SET NULL:当父表记录被删除时,将子表中的外键列设为NULL(前提是该列允许为NULL)。
  • ON DELETE RESTRICT:当父表记录被删除时,如果子表中存在该引用记录的数据,则阻止删除操作(默认行为)。
  • ON UPDATE CASCADE:当父表记录的主键被更新时,自动更新子表中所有相关的外键。
  • ON UPDATE SET NULL:当父表记录的主键被更新时,将子表中的外键列设为NULL。

注意:MySQL的InnoDB存储引擎支持外键和级联操作,MyISAM不支持。

在这个例子中,order_items表中的order_id外键设置了ON DELETE CASCADEON UPDATE CASCADE。这意味着如果orders表中某个订单被删除或更新,order_items表中引用该订单的行会自动删除或更新。

5. 删除外键

如果需要删除外键约束,可以使用以下ALTER TABLE语句:

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

外键名称可以在创建外键时指定,也可以通过SHOW CREATE TABLE 表名;查看表结构来找到。

6. 外键的注意事项

  • 数据类型匹配:外键列和被的主键列必须具有引用相同的数据类型。
  • 索引要求:MySQL中,被引用的父表列必须是主键或具有唯一索引的列。
  • 存储引擎:MySQL的InnoDB存储引擎支持外键约束,但MyISAM不支持。如果表使用的是MyISAM,外键不会生效。

7. 外键的设计建议

  • 使用合适的级别联策略:根据业务逻辑选择合适的级别联删除和更新策略。
  • 减少外键数量:在高并发的情况下,外键会增加数据库的锁定和检查压力,因此在性能要求的表中尽量减少外键数量。
  • 避免循环外键引用:避免两个互相引用对方的外键,这样会导致复杂性增加。

8. 总结

MySQL的外键约束主要维护表之间的关联性,保证数据之间的关联性和一致性。合理使用外键和级联操作可以简化数据管理,避免“孤立数据”问题。在性能要求的上述场景中,应详细使用外键,权衡性能和数据缺陷之间的关系。

5. 检查约束(CHECK)

  • 定义:检查约束用于限制列中的值必须满足指定的条件。例如,可以限制某列的值在一定范围内。
  • 创建方式
    • 创建表时定义(不过 MySQL 对检查约束的支持有限,在某些情况下可能不会完全按照预期执行),例如:
    • CREATE TABLE employees (
    • id INT PRIMARY KEY,
    • salary DECIMAL(10,2) CHECK (salary > 0)
    • );

以上代码salary DECIMAL(10,2) CHECK (salary > 0)表示检查salary的值是否大于0;

虽然 MySQL 支持语法上的检查约束,但在执行插入或更新操作时,它可能不会像其他一些数据库那样严格执行检查。不过,从 MySQL 8.0.16 开始,对于通过CREATE TABLEALTER TABLE语句创建的检查约束会有更完善的支持。

5.总结

数据库约束的三条性质:

一致性:非空承诺保证数据的基本有效性,杜绝出现无效或不完整的数据。

自由性:唯一约束、检查约束和默认值提供数据输入的自由。

完整性保证:主键和外键保证数据的唯一性和表间关系的完整性。

1.主键约束(PRIMARY KEY)

  • 作用:确保表中每条记录的唯一性,且不能为NULL。
  • 特点:每个表只能有一个主键,通常用于标识每一行数据。
  • 自动创建索引:MySQL会自动主键列创建唯一索引。

2.唯一约束(UNIQUE)

  • 作用:确保列中的所有值唯一,但可以有NULL值。
  • 特点:可以在多个列上设置唯一约束,一个表可以有多个唯一约束。

3.外键约束(FOREIGN KEY)

  • 作用:维护表之间的引用偏差,确保子表中的数据对应父表中的主键或唯一键。
  • 特点:防止删除或更新父表中引用的数据,支持级联操作(如CASCADESET NULL等)。

4.检查约束(CHECK)

  • 作用:确保列中的数据满足特定条件。
  • 特点:MySQL 8.0+版本才完全支持CHECK约束,用于验证插入或更新数据时是否满足条件。

5.非空约束(NOT NULL)

  • 作用:确保列值不能为空。
  • 特点:非常常用,防止列中出现NULL值。

6.默认值约束(DEFAULT)

  • 作用:为列默认指定值,当插入数据时,如果该列没有提供值,则使用默认值。
  • 特点:适用于INSERT操作时,自动填充空白列。

6.结语

在数据库的世界里,约束就像是小守卫,确保每一条数据都按我们规定,维护数据的协调与秩序。而作为数据库的“指挥员”,则可以安心地指挥数据的流动,不用担心数据“出走”或“闯祸”!

就像写程序时,良好的约束使你少犯错,写SQL时,合理的约束使你少出问题。记住,数据与约束之间的配合默契,才是高效开发

希望今天的数据库约束小课堂给你带来一些乐趣和启示!如果你有什么问题,随时来找我讨论哦。愿你在数据库的世界里如鱼得水,数据也不再乱跑,查询效率倍儿高

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国内首位聋人 Android 软件工程师体验通义灵码,“这真是太棒了”

Hi 大家好&#xff01; 我就是人见人爱、Bug 闪开的通义灵码&#xff01; 上个月&#xff0c;我上线了一项新能力&#xff1a; 体验通义灵码 workspace&#xff1a;轻松分析项目结构&#xff0c;结合代码仓库理解工程、查询问答等 补充说明&#xff1a;当你需要快速了解一个工…

萌熊数据科技:剑指脑机转入,开启科技新篇章

近日&#xff0c;科技圈传来一则令人瞩目的消息&#xff0c;天津萌熊数据科技有限公司和天津一万年科技发展有限公司在全国范围内大力开展AI加生命科学的主体业务&#xff0c;并明确将朝着脑机转入方向深入发展&#xff0c;引发了行业内外的广泛关注。 天津萌熊数据科技有限公司…

OceanBase 安装使用详细说明

OceanBase 安装使用详细说明 一、系统环境要求二、安装OceanBase环境方案一:在线下载并安装all-in-one安装包方案二:离线安装all-in-one安装包安装前的准备工作三、配置OceanBase集群编辑配置文件部署和启动集群连接到集群集群状态和管理四、创建业务租户和数据库创建用户并赋…

MYSQL---TEST5(Trigger触发器Procedure存储过程综合练习)

触发器Trigger 数据库mydb16_trigger创建 表的创建 goods create table goods( gid char(8) primary key, #商品号 name varchar(10), #商品名 price decimal(8,2), #价格 num int&#xff1b;&#xff09; #数量orders create tabl…

MySQL 完整教程:从入门到精通

MySQL 完整教程&#xff1a;从入门到精通 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;它使用结构化查询语言 (SQL) 来管理和操作数据。本文将详细介绍 MySQL 的基本概念、安装与配置、常用 SQL 语法、数据表的创建与管理、索引、视图、存储过程、触发器等高级特性…

winfrom控制应用程式不能双开

功能&#xff1a;控制winform应用程式不能双开 //应用程式不能双开bool isAppRunning false;Mutex mutex new Mutex(true, "MyApp", out isAppRunning);if (!isAppRunning){MessageBox.Show("程序已运行&#xff0c;不能再次打开&#xff01;");Environm…

uniapp:启动界面关闭时长控制

代码控制关闭启动界面 App启动后不会自动关闭启动界面&#xff0c;需要在代码中调用plus.navigator.closeSplashscreen关闭启动界面。"app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"autoclose" : false,}, }很多…

从数据提取到管理:TextIn平台的全面解析与产品体验

一、引言 在现代信息时代&#xff0c;文档解析和管理已经成为企业和开发者不可或缺的工具。TextIn是合合信息旗下的一款智能文档处理平台&#xff0c;为开发者和企业提供高效、精准的文档解析工具&#xff0c;帮助用户轻松应对各种复杂的文档处理需求。本文将深入探讨TextIn的…

Spring Boot技术在校园社团管理中的高效应用

3系统分析 3.1可行性分析 通过对本校园社团信息管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本校园社团信息管理系统采用SSM框架&#xff0c;JAVA作…

软件工程(软考高频)

一、软件工程概述 1.软件的基本生命周期 2.软件过程 二、软件开发方法 三、 软件开发模型 1.瀑布模型和V模型 2.原型模型和螺旋模型 3. 增量模型 4.喷泉模型 5.统一过程UP模型 6.敏捷方法 敏捷方法的开发模型 四、需求分析 1.基本概念 2.需求的分类 3.需求分析的工具 (1)数…

Spring整合Mybatis过程

配置文件 springConfig --> [jdbcConfig mybatisConfig] jdbc配置文件进行基本的数据库连接池配置 mybatis配置文件进行SqlSessionFactory Bean 和 MapperScannerConfigurer Bean的创建 在Spring容器启动时&#xff0c;系统会根据配置创建并初始化所有MyBatis所需的Bean…

ML2001-1 机器学习/深度学习 Introduction of Machine / Deep Learning

图片说明来自李宏毅老师视频的学习笔记&#xff0c;如有侵权&#xff0c;请通知下架 影片参考 【李宏毅】3.第一节 - (上) - 机器学习基本概念简介_哔哩哔哩_bilibili 1. 机器学习的概念与任务类型 概念&#xff1a;机器学习近似于寻找函数&#xff0c;用于处理不同类型的任…

【Java多线程】:理解线程创建、特性及后台进程

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 一、背景 -- 进程与线程&#x1f680; &#x1f525; 多线程是提升程序性能非常…

Matlab实现海马优化算法(SHO)求解路径规划问题

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 海马优化算法&#xff08;SHO&#xff09;是一种受自然界海马行为启发的优化算法&#xff0c;它通过模拟海马在寻找食物和配偶时的探索、跟踪和聚集行为来搜索最优解。SHO因其高效的全局搜索能力和局部搜索能力而…

【初阶数据结构与算法】复杂度分析练习之轮转数组(多种方法)

文章目录 复杂度练习之轮转数组方法1方法2方法3 总结 复杂度练习之轮转数组 题目链接&#xff1a;https://leetcode.cn/problems/rotate-array/description/    为什么我们把这道题作为复杂度的练习题呢&#xff1f;是因为我们以后做题都会涉及到复杂度的计算&#xff0c;我…

哲学家就餐问题(Java实现信号量和PV操作)

哲学家就餐是经典的PV操作。 一个哲学家同时拿起左边的筷子和右边的筷子进行就餐&#xff0c;每一个哲学家都会等待右边的筷子&#xff0c;具备了死锁问题之一的循环等待。 基础的哲学家就餐问题代码 在Java中&#xff0c;Semaphore 是一个用于控制对某个资源的访问的同步工具…

mutable用法

mutable 关键字用于允许类的某个成员变量在 const 成员函数中被修改。通常&#xff0c;const 成员函数不能改变对象的任何成员变量&#xff0c;但将成员变量声明为 mutable 可以例外 class Hero { public:Hero():m_Hp(0), m_getHpCounter(0){}int getHp() const {m_getHpCounte…

C++ | Leetcode C++题解之第537题复数乘法

题目&#xff1a; 题解&#xff1a; class Solution { public:string complexNumberMultiply(string num1, string num2) {regex re("\\|i"); vector<string> complex1(sregex_token_iterator(num1.begin(), num1.end(), re, -1), std::sregex_token_iterator…

告别传统营销,HubSpot AI分析工具带你玩转新潮流

你们知道吗&#xff1f;现在的人工智能&#xff08;AI&#xff09;技术可是越来越厉害了&#xff0c;它简直就是我们营销人员的超级外挂&#xff01;有了AI分析工具&#xff0c;我们不仅能优化营销效果&#xff0c;还能大大提升工作效率。那么&#xff0c;具体是怎么一回事呢&a…

Docker打包自己项目推到Docker hub仓库(windows10)

一、启用Hyper-V和容器特性 1.应用和功能 2.点击程序和功能 3.启用或关闭Windows功能 4.开启Hyper-V 和 容器特性 记得重启生效&#xff01;&#xff01;&#xff01; 二、安装WSL2&#xff1a;写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/143057041 三…