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

news2024/11/26 10:40:52

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

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时,合理的约束使你少出问题。记住,数据与约束之间的配合默契,才是高效开发

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

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

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

相关文章

go中Println和Printf的区别

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 go中Println和Printf的区别 package mainimport ( "fmt" )//TIP To run your code, right-click the c…

【系统面试篇】进程和线程类(1)(笔记)——区别、通讯方式、同步、互斥、锁分类

目录 一、问题综述 1. 进程和线程的区别&#xff1f; 2. 进程的状态有哪些&#xff1f; 3. 进程之间的通信方式? &#xff08;1&#xff09;管道 &#xff08;2&#xff09;消息队列 &#xff08;3&#xff09;共享内存 &#xff08;4&#xff09;信号量 &#xff08…

编译安装并刷写高通智能机器人SDK

The Qualcomm Intelligent Robotics Product SDK (QIRP SDK) 高通智能机器SDK基于ROS2进行开发&#xff0c;此SDK适用于高通linux发行版本&#xff0c;QIRPSDK中提供以下内容&#xff1a; ROS 包中用于支持机器人应用程序开发的参考代码 用于评估机器人平台的端到端场景示例集…

网页版五子棋—— WebSocket 协议

目录 前言 一、背景介绍 二、原理解析 1.连接过程&#xff08;握手&#xff09; 2.报文格式 三、代码示例 1.服务端代码 &#xff08;1&#xff09;TestAPI 类 &#xff08;2&#xff09;WebSocketConfig 类 2.客户端代码 3.代码演示 结尾 前言 从本篇文章开始&am…

鸿蒙应用开发:下载功能

鸿蒙系统不断发展&#xff0c;有与安卓、iOS 形成三足鼎立之势&#xff0c;且其在智能手机、智能穿戴、车载、家居等行业领域的应用越来越广泛。作为开发者&#xff0c;如何抓住鸿蒙生态崛起的机遇&#xff0c;解决开发挑战&#xff0c;创造更好的应用体验&#xff1f;欢迎您和…

小白直接冲!BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测

小白直接冲&#xff01;BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 小白直接冲&#xff01;BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测效果一览基本介绍程序设计参考资料 效果一…

如何绘制产业链图谱?

绘制产业链图谱是一个系统性的工作&#xff0c;涉及到对产业的深入理解和分析。对于一般产业绘制产业图谱的步骤&#xff0c;我们可以参照以下流程&#xff1a; 1.明确目标产业链&#xff1a;确定要分析的产业链&#xff0c;比如新材料、新能源、智能制造等&#xff0c;这通常…

Pycharm,2024最新专业版下载安装配置详细教程!

先来一段官方介绍&#xff0c;PyCharm是一种PythonIDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外&#xff0c;该IDE提供了一些高级功能…

鸿蒙开发——进程模型与进程通信

1、进程模型 ❓ 什么是进程&#xff1f; 进程是一个正在执行的程序的实例。当我们启动一个程序时&#xff0c;操作系统会创建一个进程&#xff0c;分配给它所需的资源&#xff0c;如内存和CPU时间。每个进程至少有一个线程&#xff0c;即执行线程&#xff0c;负责执行程序的指…

SQL server 中 CROSS APPLY的使用

CROSS APPLY 是 SQL Server 中的一个操作符&#xff0c;用于将一个表表达式&#xff08;如子查询、函数等&#xff09;与外部表进行连接。CROSS APPLY 类似于 INNER JOIN&#xff0c;但它允许你在一个查询中多次引用外部表的行&#xff0c;并且可以动态地生成结果集。 基本语法…

xlwings,让excel飞起来!

excel已经成为必不可少的数据处理软件&#xff0c;几乎天天在用。python有很多支持操作excel的第三方库&#xff0c;xlwings是其中一个。 关于xlwings xlwings开源免费&#xff0c;能够非常方便的读写Excel文件中的数据&#xff0c;并且能够进行单元格格式的修改。 xlwings还…

[大模型]Diffusion扩散式生成模型

一、概述 扩散式生成模型相较于GAN网络的对抗式生成模型&#xff0c;有更高的精度&#xff0c;也更符合人类的视觉和审美罗技&#xff0c;且风格化能力更强。现行的所有Diffusion模型都是基于2020年的论文DDPM来实现的。 GAN网络通过使生成器(Generator)生成的模型尽可能的逼近…

十四届蓝桥杯STEMA考试Python真题试卷第二套第五题

来源:十四届蓝桥杯STEMA考试Python真题试卷第二套编程第五题 本题属于迷宫类问题,适合用DFS算法解决,解析中给出了Python中 map() 和列表推导式的应用技巧。最后介绍了DFS算法的两种常见实现方式——递归实现、栈实现,应用场景——迷宫类问题、图的连通性、树的遍历、拓朴排…

keil5的Debug调试时,卡在 LDR R0, =SystemInit,无法往后进行

解决办法&#xff1a;使用STM32Cube生成的工程文件时&#xff0c;勾选Use MicroLIB即可

OpenEuler 使用ffmpeg x11grab捕获屏幕流,rtsp推流,并用vlc播放

环境准备 安装x11grab(用于捕获屏幕流)和libx264(用于编码) # 基础开发环境&x11grab sudo dnf install -y \autoconf \automake \bzip2 \bzip2-devel \cmake \freetype-devel \gcc \gcc-c \git \libtool \make \mercurial \pkgconfig \zlib-devel \libX11-devel \libXext…

ai常见实验

参考链接https://arxiv.org/pdf/2410.19894 对比实验&#xff08;sota 表格&#xff09; -辅助信息可以体现 P F 等 可视化结果 &#xff08;图片形式&#xff09; 消融实验 超参数实验 &#xff08;有时候表示 有时候单独表格 看哪个参数好&#xff09; 部分消融和超参数…

【万字详文介绍】:迭代扩张卷积神经网络(IDCNN)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

Oracle OCP认证考试考点详解082系列12

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 56. 第56题&#xff1a; 题目 解析及答案&#xff1a; 关于企业管理器&#xff08;EM&#xff09;Express&#xff0c;以下哪两个陈述是…

任务:拟合曲面

3d 要拟合粗的蓝色曲面&#xff0c;剩下三条线是在3个平面的投影 1 2 3 4d

Python世界:自动化办公Word之批量替换文本生成副本

Python世界&#xff1a;自动化办公Word之批量替换文本生成副本 任务背景编码思路代码实现相关参考 任务背景 为提高办公效率&#xff0c;用python试手了一个word任务&#xff0c;要求如下&#xff1a; 给你一个基础word文档A&#xff0c;格式为docx&#xff0c;名字为&#xf…