SQL 触发器抛出异常后,事务为什么会被回滚

触发器里一旦抛错,为什么有的库会自动回滚,有的却只是报错后继续保留数据?关键不在“触发器会不会回滚”,而在数据库引擎、事务设置和异常传播链路。本文用 MySQL 与 SQL Server 对照拆开讲清常见误判与排查方法。

SQL 触发器抛出异常后,事务为什么会被回滚

如何使用 SQL SELECT 查询重复数据?

SQL 查重常见分成两类:先找出哪些值重复,再定位到具体重复行。本文按查询目标和数据库版本拆开说明,分别给出 GROUP BY + HAVING、ROW_NUMBER() 以及 MySQL 5.7 自连接方案,并补上删除前最容易忽略的保留策略与复核要点。

如何使用 SQL SELECT 查询重复数据?

SQL窗口函数如何查询首次购买后的复购记录

查询“首次购买后的复购记录”,关键不在于先写哪种 SQL,而在于先把“首次购买”的业务口径定清楚。本文用窗口函数为主线,拆解如何用 `ROW_NUMBER()` 锁定每个用户首单、再筛出后续订单,并说明 MySQL、PostgreSQL、SQL Server 的写法差异与常见误区。

SQL窗口函数如何查询首次购买后的复购记录

如何避免 SQL 存储过程批量更新阻塞业务?

批量更新本身不可怕,真正拖垮业务的往往是事务过大、条件不走索引,以及分页策略选错。本文按“分批推进、索引命中、事务收口”三条主线,整理出更稳的存储过程写法,并点出 SQL Server、MySQL、PostgreSQL 各自容易踩的坑。

如何避免 SQL 存储过程批量更新阻塞业务?

SQL 如何按自然周分组统计订单数量

按自然周统计订单数量时,很多 SQL 写法会在周起点、首周定义和跨年边界上出错,导致出现“第0周”或周数错位。本文按 MySQL、PostgreSQL、SQL Server 分别说明正确分组方式,并给出跨年场景下更稳妥的 ISO 周处理思路。

SQL 如何按自然周分组统计订单数量

为什么 SQL CAST 函数转换日期会失败

SQL 里把字符串直接 `CAST` 成日期,看起来简单,实际最容易踩到数据库默认解析规则、非法日期静默失败和索引失效这三类坑。本文按常见查询场景拆开说明 SQL Server、PostgreSQL、MySQL 的差异,并给出更稳妥的写法。

为什么 SQL CAST 函数转换日期会失败

SQL 触发器可以调用存储过程吗

触发器能否调用存储过程,关键不在“能不能调”,而在过程内部是否触碰了事务、引擎和参数传递限制。本文分别梳理 MySQL 与 SQL Server 的常见写法、ERROR 1422 的真正原因,以及触发器调用后数据未更新、BEFORE 触发器改写 NEW 字段失效的排查方法。

SQL 触发器可以调用存储过程吗

如何使用 SQL LTRIM 函数清除字符串左侧空格

LTRIM 常被拿来清理字符串左侧空格,但它的适用范围其实很窄:只处理 ASCII 空格,跨数据库支持也不一致。本文按“能不能用、为什么没效果、会不会拖慢查询、迁移时怎么替代”四个问题梳理 SQL Server、MySQL 和 PostgreSQL 中的正确写法与避坑点。

如何使用 SQL LTRIM 函数清除字符串左侧空格

如何在 SQL 视图中使用子查询

在 SQL 视图中使用子查询并非一律可行,关键在于数据库版本、子查询类型以及优化器的处理方式。本文从能否直接写、何时用 WITH 改写、MySQL 5.7 的替代方案,到常见性能失速原因,梳理出一套更适合落地判断的写法与排查思路。

如何在 SQL 视图中使用子查询

如何避免 SQL JOIN 更新多次命中同一行

MySQL 的 `UPDATE ... JOIN` 一旦遇到非唯一匹配,往往不会报错,而是让同一行被多次命中,最终只保留最后一次结果。这类问题常由临时表重复、过滤条件缺失或误用 `LEFT JOIN` 引起。本文从成因、排查、改写方式和上线前校验四个方面,梳理一套更稳妥的处理方法。

如何避免 SQL JOIN 更新多次命中同一行

SQL 如何对 JSON 字段进行分组聚合

JSON 字段里的数组或对象,不能直接拿来做 `GROUP BY`。这篇文章把 MySQL 8.0+ 的 `JSON_TABLE()` 和 PostgreSQL 的 `jsonb_array_elements()` 拆开说明,并补上类型转换、空值过滤、分组维度选择这些最容易把统计结果做错的关键点。 JSON 字段里有数组或对象时,不能直接 GROUP BY 。正确做法是先展开成行,再按主键或提取字段分组。

SQL 如何对 JSON 字段进行分组聚合