MySQL增删改查与常见陷阱详解

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于增删改查与常见陷阱的相关内容,下面一起来看一下,希望对大家有帮助。

MySQL增删改查与常见陷阱详解

推荐学习:mysql视频教程

一、MySQL的增删改查

MySQL 中我们最常用的增删改查,对应SQL语句就是 insert 、delete、update、select,这种操作数据的语句,又叫Data Manipulation Statements(数据操作语句)。

一共是15种,分别是CALL、DELETE、DO、HANDLER、IMPORT TABLE、INSERT、LOAD DATA、LOAD XML、REPL ACE、SELECT、Subqueries、TABLE、UPDATE、VALUES、WITH。

1、insert语句

1.1 insert语句原理

insert 插入,下面给出插入数据行的通用语句,如果列表和 VALUES 列表都为空,则INSERT创建一行,每列设置为其默认值;

还可以使用 VALUES ROW() 语法的语句也可以插入多行。在这种情况下,每个值列表必须包含在ROW()(行构造函数)中,如下所示:

-- 插入语句模板INSERT INTO tbl_name () VALUES();-- 插入多行INSERT INTO tbl_name (a,b,c) VALUES(1,2,3), (4,5,6), (7,8,9);INSERT INTO tbl_name (a,b,c) VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9);

我们建表的时候经常会使用主键,当我们的系统执行并发落库的时候,为了避免主键冲突,经常会使用 ON DUPLICATE KEY UPDATE。

注意:ON DUPLICATE KEY UPDATE 是Mysql特有的语法,仅Mysql有效。作用:当执行insert操作时,有已经存在的记录,执行update操作。

如果使用了 ON DUPLICATE KEY UPDATE 子句,并且重复的键导致执行UPDATE,则该语句需要更新列的UPDATE权限。对于已读取但未修改的列,您只需要SELECT权限(因为无需更新,很好理解)。

INSERT INTO test ( id, NAME, age ) VALUES( 1, '张三', 13 ) ON DUPLICATE KEY UPDATE age = 13,

1.2 MySQL插入陷阱

如果未启用严格模式(严格 SQL 模式),MySQL 对任何没有显式定义默认值的列使用隐式默认值。如果启用了严格模式,如果任何列没有默认值,则会发生错误。(严格模式会在后续的文章中讲到) 。

2、delete语句

2.1 delete语句原理

delete顾名思义是删除,该DELETE语句从中删除行 tbl_name并返回已删除的行数。要检查删除的行数我们一般写代码的时候使用 int 类型返回:

-- 删除语法DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name    [PARTITION (partition_name [, partition_name] ...)]    [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]-- WHERE 中的条件确定要删除哪些行,如果没有WHERE 子句则删除所有行-- 如果指定了ORDER BY子句,则按指定的顺序删除行-- LIMIT子句对可以删除的行数进行了限制-- 如果指定LOW_PRIORITY修饰符,服务器会延迟删除,DELETE直到没有其他客户端从表中读取-- QUICK是否合并索引进行删除操作,可能会导致索引中未回收的空间浪费-- IGNORE,MySQL在删除行的过程中忽略可忽略的错误

如果指定LOW_PRIORITY修饰符,服务器会延迟删除,DELETE直到没有其他客户端从表中读取。QUICK是否合并索引进行删除操作,可能会导致索引中未回收的空间浪费。IGNORE,MySQL在删除行的过程中忽略可忽略的错误。

WHERE 中的条件确定要删除哪些行,如果没有WHERE 子句则删除所有行,如果指定了ORDER BY子句,则按指定的顺序删除行,LIMIT子句对可以删除的行数进行了限制

2.2 MySQL删除陷阱

1、大批量删除

如果要从大表中删除许多行,则可能会超过InnoDB表的锁表大小。为了避免这个问题,或者仅仅为了最小化表保持锁定的时间,以下策略可能会有所帮助:

1、使用存储过程进行不影响业务的小批量、长时间删除,删除完毕后将存储过程从生产环境下线。

2、选择不删除的行,同步与原表结构相同的空表中:INSERT INTO t_copy SELECT * FROM t WHERE … ;

3、用于 RENAMETABLE 以原子方式将原始表移开并将副本重命名为原始名称:RENAME TABLE t TO t_old, t_copy TO t;

2、多表删除

1、根据WHERE子句中的条件,可以在DELETE语句中指定多个表以从一个或多个表中删除行,但是不能在多表DELETE中使用ORDER BY或LIMIT。

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3    WHERE t1.id=t2.id AND t2.id=t3.id;

3、update语句原理

UPDATE是修改表中行的语句,返回实际更改的行数,要检查删除的行数我们一般写代码的时候使用 int 类型返回,对于单表语法,UPDATE语句使用新值更新命名表中现有行的列。

先见AI 先见AI

数据为基,先见未见

先见AI 95 查看详情 先见AI

SET 要修改的列以及应该给出的值,每个值都可以作为表达式或关键字DEFAULT给出,以将列显式设置为其默认值。

WHERE 指定标识要更新哪些行的条件。如果没有WHERE子句,将更新所有行。如果指定了ORDER BY子句,则将按指定的顺序更新行。LIMIT子句限制了可以更新的行数。

-- 更新单表语法UPDATE [LOW_PRIORITY] [IGNORE] table_reference    SET assignment_list    [WHERE where_condition]    [ORDER BY ...]    [LIMIT row_count]-- 使用LOW_PRIORITY修饰符,UPDATE延迟执行,直到没有其他客户端从表中读取-- 使用IGNORE修饰符,即使更新期间发生错误,更新语句也不会中止UPDATE item_id, discounted SET items_info WHERE id = "";

4、select

SELECT用于检索从一个或多个表中选择的行,并且可以包括UNION操作和子查询。从MySQL 8.0.31开始,还支持INTERSECT和EXCEPT操作。后面笔者会单独拿出一篇文章讲解子查询、左连接、查询优化、查询原理等等。

后面更新后会附上连接

二、15种MySQL数据操作语句

类似于增删改查的语句我们在第一节已经学习,本小节主要讲解 CALL、DO、HANDLER、IMPORT TABLE、LOAD DATA、LOAD XML、REPL ACE、Subqueries、TABLE、VALUES、WITH,这11个语句的使用,后续会详细的进行详细分析,关注本专栏。

MySQL增删改查与常见陷阱详解

1、REPLACE语句

REPLACE的工作方式与INSERT完全相同,只是如果表中的一个旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前会删除旧行。在MySQL 8.0中已不支持DELAYED。

2、CALL语句

CALL语句调用先前使用CREATE procedure定义的存储过程。当过程返回时,客户端程序还可以获得例程内执行的最终语句所影响的行数。

3、TABLE语句

TABLE是MySQL 8.0.19中引入的DML语句,返回命名表的行和列。

4、WITH语句

WITH每个子子句提供一个子查询,该子查询生成一个结果集,并将名称与子查询相关联。

WITH  cte1 AS (SELECT a, b FROM table1),  cte2 AS (SELECT c, d FROM table2)SELECT b, d FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;

三、MySQL查询陷阱

两个值进行查询,运算或者比较,首先要求数据类型必须一致。如果发现两个数据类型不一致时就会发生隐式类型转换

问题描述:

分享一个笔者同事曾经发生的产线问题:在一次MySQL查询中,某字段为 varchar 字符串类型,传入参数值为 long 数字类型,发现查询的结果和预期的不一致。

select * from 表 where odr_id = "";select * from 表 where odr_id = long;

但是由于测试环境的数据量较少,并没有发现,只到上了生产环境,在进行大数据查询时,由于数据库的odr_id是 varchar 类型,查询条件是 long类型,所有每条查询出来的数据都会进行隐式类型转换的比较,直接导致long sql,处理办法是紧急版本上线。

隐式类型转换原理:

如果一个或两个参数均为NULL,则比较的结果为NULL,除了  相等比较运算符。对于NULL NULL,结果为true;如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较;如果两个参数都是整数,则将它们作为整数进行比较。

如果不与数字比较,则将十六进制值视为二进制字符串;如果参数之一是  timestamp 或 datatime column,而另一个参数是常量,则在执行比较之前,该常量将转换为时间戳;如果参数之一是十进制值,则比较取决于另一个参数。

如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较(这里如果生产环境是varchar后果将是灾难级的)

如果另一个参数是浮点值,则将参数作为浮点值进行比较。;在所有其他情况下,将参数作为浮点数(实数)进行比较。例如,将字符串和数字操作数进行比较,将其作为浮点数的比较。

通过隐式类型转换可以得出上述示例的结果:当查询中有数字时那么会将字符串转化成数字进行比较。所以当你的列为字符串时那么需要将列中字符串进行类型格式转换而进行字符格式转换之后则与索引不一致;当你的列为数字时查询等式为字符串时只是把查询的常量转成数字并不影响列的类型所以依然可以使用索引并没有破坏索引的类型。

推荐学习:mysql视频教程

以上就是MySQL增删改查与常见陷阱详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/278288.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 15:32:04
下一篇 2025年11月4日 15:33:07

相关推荐

  • 使用 Golang 进行跨数据库 JOIN 查询

    本文介绍了如何在 Golang 中使用 SQL JOIN 语句跨多个数据库进行数据查询。通过直接在 SQL 语句中指定数据库名称,可以实现跨库关联查询。同时,也讨论了另一种通过多个数据库连接分别查询数据并在应用层进行关联的方法,但推荐使用数据库服务器本身提供的 JOIN 功能以获得更好的性能。 在 …

    2025年12月16日
    000
  • 在Golang中高效执行MySQL跨数据库JOIN操作

    本文旨在指导读者如何在golang应用中,利用mysql数据库的特性,高效地执行跨数据库的join查询操作。我们将详细介绍如何构建sql语句,以便在同一mysql服务器实例上的不同数据库之间建立关联,并通过go的`database/sql`包进行查询,同时强调最佳实践和注意事项,避免常见的性能陷阱。…

    2025年12月16日
    000
  • Golang 中使用 JOIN 查询多个数据库

    本文介绍了如何在 Golang 中使用 SQL JOIN 语句跨多个 MySQL 数据库进行查询。通过直接在 SQL 查询中指定数据库名称,可以轻松地在不同数据库的表之间建立关联,检索所需数据。同时,也简要讨论了使用多个数据库连接的替代方案,并强调了使用 JOIN 语句的效率优势。 在 Golang…

    2025年12月16日
    000
  • Go 语言 ORM 框架选型与应用指南

    本文旨在帮助开发者在 Go 语言项目中选择合适的 ORM (Object-Relational Mapping) 框架,并提供一些可用于操作现有 MySQL 数据库并生成模型代码的工具。我们将介绍一些流行的 Go ORM 库,并重点关注那些支持自动模式生成的库,以简化与遗留数据库的集成。 在 Go …

    2025年12月16日
    000
  • Go语言ORM框架选型与应用:连接遗留MySQL数据库的最佳实践

    本文旨在为Go开发者提供一份关于ORM框架选型的实用指南,特别针对需要连接和操作遗留MySQL数据库的场景。我们将探讨如何利用Go语言的ORM框架,简化数据库交互,并实现高效的数据访问层。本文将介绍一些流行的Go ORM库,并重点关注那些支持从现有数据库结构生成模型代码的框架,帮助开发者快速上手,构…

    2025年12月16日
    000
  • Go ORM 框架选型与应用:快速对接遗留 MySQL 数据库

    本文旨在帮助开发者在 Go 语言项目中选择合适的 ORM (Object-Relational Mapping) 框架,特别是针对需要与遗留 MySQL 数据库进行交互的场景。我们将介绍一些流行的 Go ORM 库,并重点关注如何利用这些库来简化数据库模型的生成和数据访问操作,从而提升开发效率。 G…

    2025年12月16日
    000
  • Go 语言 ORM 框架选型指南:简化数据库交互

    本文旨在帮助开发者在 Go 语言项目中选择合适的 ORM (Object-Relational Mapping) 框架,尤其针对需要与现有 MySQL 数据库交互的场景。我们将介绍一些流行的 Go ORM 库,并简要分析它们的特点,以便开发者根据项目需求做出明智的选择。 在 Go 语言中,ORM 框…

    2025年12月16日
    000
  • Go语言ORM框架选型指南:连接遗留MySQL数据库并生成模型代码

    本文旨在帮助开发者在Go语言项目中,特别是针对需要连接遗留MySQL数据库并生成模型代码的场景下,选择合适的ORM(对象关系映射)框架。我们将介绍几个流行的Go语言ORM库,并重点关注支持自动模式生成的框架,以简化开发流程。 在Go语言中,ORM框架可以极大地简化数据库操作,提高开发效率。当面对遗留…

    2025年12月16日
    000
  • Golang 中跨数据库 JOIN 查询

    本文介绍了如何在 Golang 中使用 JOIN 查询跨多个数据库的数据。通过直接在 SQL 查询语句中指定数据库名,或者建立多个数据库连接,可以实现跨库查询。推荐使用 SQL 语句直接查询,避免在应用程序中处理大量数据。 在 Golang 中,使用 database/sql 包可以方便地连接和操作…

    2025年12月16日
    000
  • MySQL INSERT 语句:提升可读性的 SET 语法

    在mysql中,传统的`insert … values`语法在处理大量列时,其值与列名的对应关系不易辨识,导致语句可读性下降。本文将介绍如何利用mysql特有的`insert … set`语法,通过明确的`列名 = 值`对,显著提升`insert`语句的清晰度和维护性,使数据…

    2025年12月16日
    000
  • 提升SQL INSERT语句可读性:SET语法详解

    当sql insert语句涉及大量列时,传统的values列表可能导致可读性下降,难以快速识别值与列的对应关系。本文将介绍mysql中insert … set语法,它通过直接将列名与值进行关联,显著提升了语句的清晰度和可维护性,特别适用于复杂的插入操作。 在数据库操作中,INSERT语句…

    2025年12月16日
    000
  • MySQL INSERT 语句可读性优化:利用 SET 语法提升代码清晰度

    本文探讨了在mysql中优化`insert`语句可读性的方法。针对传统`insert … values`语法在处理大量列时难以匹配值与列名的问题,推荐使用`insert … set`语法。这种方式能显著提升sql语句的清晰度,使开发者更容易理解和维护代码,尤其适用于go等语言…

    2025年12月16日
    000
  • 提升MySQL INSERT语句可读性:SET语法实践指南

    本文旨在解决传统sql insert into … values 语句在处理大量列时可读性差的问题。我们将深入探讨mysql中更具可读性的insert into … set 语法,该语法通过直接将列名与值关联,显著提升了语句的清晰度和维护性,尤其适用于动态构建或调试sql语句…

    2025年12月16日
    000
  • 提升MySQL INSERT 语句清晰度:SET 语法详解

    本文旨在解决sql `insert` 语句在处理大量字段时可读性差的问题。传统 `values` 列表语法使得列与值难以对应,降低了代码清晰度。我们将介绍并详细阐述mysql中更为优雅的 `insert … set` 语法,通过直接将列与值关联,显著提升语句的可读性和维护性,特别适用于需…

    2025年12月16日
    000
  • 如何在Golang中测试数据库操作_Golang数据库操作测试方法汇总

    使用测试专用数据库、SQLite模拟、Mock库和Docker集成测试可有效提升Go语言数据库操作的测试效率与稳定性,确保数据隔离与测试准确性。 在Go语言开发中,数据库操作是常见需求,而如何有效测试这些操作直接影响代码的稳定性和可维护性。直接在真实数据库上运行测试会带来环境依赖、数据污染和速度慢等…

    2025年12月16日
    000
  • Golang如何使用单例模式控制资源访问_Golang单例模式资源访问实践详解

    单例模式通过 sync.Once 实现并发安全的唯一实例控制,确保如数据库连接等共享资源在整个程序中仅初始化一次,避免竞态条件并提升资源管理效率。 在 Golang 中,单例模式常用于控制对共享资源的访问,比如数据库连接、配置管理器或日志实例。它的核心目标是确保一个类型在整个程序生命周期中仅存在一个…

    2025年12月16日
    000
  • Go database/sql 事务与连接管理深度解析:避免“连接过多”错误

    本文深入探讨go语言`database/sql`包中常见的“连接过多”错误,该问题通常源于对事务提交机制的误解。我们将详细分析错误原因,即使用原始sql `commit`而非`*sql.tx`对象的`commit()`方法,导致连接无法正确释放回连接池。文章将提供正确的事务管理范式、连接池配置建议及…

    2025年12月16日
    000
  • 如何在Golang中实现微服务健康检查_Golang微服务健康检查实现方法汇总

    Golang微服务健康检查通过HTTP接口、依赖检测、框架集成和容器平台联动实现。1. 暴露/health端点返回JSON状态;2. 验证数据库、Redis等依赖连通性;3. 使用Go-kit构建结构化健康逻辑;4. Kubernetes通过liveness和readiness探针调用健康接口,区分…

    2025年12月16日
    000
  • Go database/sql 事务与连接管理深度解析

    本文深入探讨go语言`database/sql`包在使用事务时常见的“too many connections”错误及不当的事务提交方式。通过解析`sql.db`连接池的工作原理和事务(`sql.tx`)的正确生命周期管理,文章将提供一套规范的数据库操作实践,包括正确的事务提交方法、连接复用策略和连…

    2025年12月16日
    000
  • 如何在Golang中搭建基础的在线商城项目

    答案:使用Gin框架和GORM搭建分层架构的在线商城,实现用户、商品、订单模块。项目包含路由注册、业务处理、数据库操作三层结构,通过main启动服务并初始化MySQL连接,支持RESTful接口访问商品与订单数据。 搭建基础的在线商城项目:Golang 实现思路 在 Golang 中搭建一个基础的在…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信