语句级TSQL和行级的Mysql小对比

举报
码乐 发表于 2025/09/16 06:25:55 2025/09/16
【摘要】 1 简介SQL(结构化查询语言)是 用于管理和作关系数据库的标准语言,支持查询、更新和删除数据等作。即使相同的SQL标准在不同 厂商实现后仍有不同之处。T-SQL(Transact-SQL)是 Microsoft 开发的 SQL 扩展,专门为 SQL Server 添加了高级功能和过程功能。理解TSQL 与 开源 mysql 的语法异同点有助于深入了解该查询语言标准。理解 SQL Ser...

1 简介

SQL(结构化查询语言)是 用于管理和作关系数据库的标准语言,支持查询、更新和删除数据等作。即使相同的SQL标准在不同 厂商实现后仍有不同之处。

T-SQL(Transact-SQL)是 Microsoft 开发的 SQL 扩展,专门为 SQL Server 添加了高级功能和过程功能。理解TSQL 与 开源 mysql 的语法异同点有助于深入了解该查询语言标准。

理解 SQL Server (T-SQL) 和 MySQL 在触发器上的差异与共性。下面我逐步对比说明:

2 相同点(符合 SQL 标准的部分)

  • 触发器语义相同

都是定义在表上的触发器 (trigger),在 INSERT 操作发生时执行。

都能实现基于事件(如 AFTER INSERT)的自动逻辑。

  • 作用机制一致

都通过“虚拟表”来访问新插入的数据:

  SQL Server: inserted

  MySQL: NEW

这都是 SQL 标准中规定的“行级数据访问”的实现方式。

  • 触发器中的更新逻辑

在 department 表里根据 DepID 更新 Total 字段。

都体现了触发器的典型用途:保持表间数据一致性。

3. 语法差异

  • (1) 触发器定义方式

    SQL Server (T-SQL)
    
    create trigger trglnsertStudent on student for insert as ...
    

FOR INSERT 表示触发条件。

语句主体用 AS 引出。

默认是 语句级触发器(一次插入多行时 inserted 表包含多行)。

  MySQL

  CREATE TRIGGER trgInsertStudent
  AFTER INSERT ON student
  FOR EACH ROW
  BEGIN ... END;

明确写 AFTER INSERT。

必须指定 FOR EACH ROW,表示是 行级触发器。

主体必须用 BEGIN … END 包裹。

  • (2) 新数据访问方式

SQL Server

用虚拟表 inserted(可以包含多行)。

必须写成 SELECT … FROM inserted。

MySQL

使用 NEW.column_name 来访问新插入行的数据。

是行级触发器,只能处理一行,不存在“多行 inserted 表”。

  • (3) 变量声明与赋值

    SQL Server
    
    declare @DepID int;
    select @DepID = DepID from inserted;
    

使用 T-SQL 变量,赋值语法是 select @var = col from …。

  MySQL

  WHERE DepID = NEW.DepID;

不需要声明局部变量,直接用 NEW.DepID。

  • (4) 多行处理差异

SQL Server触发器是语句级触发器,inserted 表可能包含多行。

写 select @DepID = DepID from inserted 时,如果插入多行,只会取最后一行(潜在 bug)。

正确做法通常是基于集合:

    update d
    set d.Total = d.Total + i.cnt
    from department d
    join (select DepID, count(*) as cnt from inserted group by DepID) i
      on d.DepID = i.DepID;

MySQL强制是行级触发器,每次触发只处理一行,因此 NEW.DepID 就够了。

插入多行时,会逐行触发多次。

4. 相同标准的实现,为什么会有不同

  • 相同点

两者都遵循 SQL 标准 (SQL-92/SQL:1999) 对触发器的基本定义:

可以在 INSERT/UPDATE/DELETE 时触发

可以访问新旧数据 (NEW/OLD)

  • 差异原因,厂商实现风格不同:

SQL Server 倾向于 集合化操作(一次处理多行),因此虚拟表 inserted 和 deleted 是集合。

MySQL 倾向于 逐行处理,所以触发器是 FOR EACH ROW。

T-SQL 是早期的 SQL 方言,更多使用变量与批处理风格。

MySQL 后来才支持触发器(5.0+),设计时借鉴了标准,简化为行级触发器。

标准的灵活性:
SQL 标准只规定“必须能访问新旧数据”,并没有强制实现方式,所以不同数据库厂商有自由发挥。

5 小结

SQL(结构化查询语言)是一种标准编程语言,用于管理和作关系数据库。它用于各种任务,包括查询数据、更新记录、插入新数据和删除数据库中的数据。

SQL 对于与数据库交互以及对存储在其中的数据执行作至关重要。以下是一些用于与数据库通信的 SQL 命令,例如存储、检索、作数据。

  用于在数据库中创建、删除、更改和截断的数据定义语言。
  用于在数据库中 插入、更新和删除数据的数据作语言。
  用于撤销和授予数据的数据控制语言。
  用于提交和回滚数据的事务控制语言。
  用于选择数据的数据查询语言。
  标准 SQL 确保不同数据库系统之间的兼容性和一致性。

不同方言两者语义上类似,但 T-SQL 偏集合、MySQL 偏行级。

相同点:都符合 SQL 标准的触发器定义。

不同点:主要体现在 触发器级别(语句级 vs 行级)、数据访问方式(inserted vs NEW)、语法结构。

差异的根源是:SQL 标准留有余地,不同厂商根据内部架构和习惯实现。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。