首页/数据/SQL 速查/SQL 注释:-- 与 /* */

SQL 注释:-- 与 /* */

三种注释写法与可执行注释的区别:MySQL 支持 # 单行注释与版本注释 /*! */,PostgreSQL 遵循标准的两类注释。

SQL 速查数据更新于 2026-10-13

注释有几种写法

SQL 注释主要有三类:-- 单行注释与 /* */ 块注释是 MySQL 与 PostgreSQL 通用的标准形式;MySQL 另外支持 # 作为单行注释,以及 /*! ... */ 这种「可执行注释」——满足版本条件时里面的内容会被真正执行。此外 /*+ ... */ 形式的优化器提示语法上像注释,实际会影响执行计划。

基本信息

标准单行-- 后必须跟空白(空格或制表符)才算注释
块注释/* */ 可跨行
MySQL 扩展# 单行注释;/*! ... */ 内容会被执行
优化器提示/*+ ... */,MySQL 8.0 原生支持,PostgreSQL 需扩展
作用注释本身不参与执行,提示是唯一例外

典型使用场景

  • 给复杂 SQL 分段加说明,便于交接与复查
  • 调试时临时注释掉一段条件,观察结果变化
  • 迁移工具用可执行注释携带版本化的初始化命令
  • 用优化器提示引导执行计划做对比实验
  • 在视图与存储过程定义里留下维护说明

基本写法

基本写法
-- 单行注释:标准写法,MySQL 与 PostgreSQL 都支持
# MySQL 独有的单行注释
/* 跨行
   注释 */
SELECT 1;                 -- 行尾注释同样有效

可执行注释与提示

可执行注释与提示
-- MySQL 可执行注释:按版本号条件执行,迁移工具常用
/*!40101 SET NAMES utf8mb4 */;

-- 优化器提示:语法像注释,实际会影响执行计划
SELECT /*+ MAX_EXECUTION_TIME(1000) */ COUNT(*) FROM orders;   -- MySQL 8.0
SELECT /*+ IndexScan(orders idx_orders_created) */ * FROM orders;   -- PG 需 pg_hint_plan 扩展

注释形式对照

写法MySQLPostgreSQL说明
-- 单行支持(后需空白)支持标准形式
# 单行支持不支持MySQL 扩展
/* */ 块支持支持可跨行
/*! */支持且会执行不支持版本化可执行注释
/*+ */8.0 原生提示需装扩展优化器提示
MySQL 的 -- 后面必须有空白:写成 --注释(连在一起)不构成注释,语句会直接报语法错误。这一点是从其他数据库迁移过来时最容易踩的坑。
/*! */ 里的内容在满足版本条件时真的会执行:从备份或迁移工具里复制语句时要单独核对,别把它当成普通注释忽略过去。

易错点

  • MySQL 里写 --注释 不留空格:不构成注释,语句直接语法报错
  • 把 /*! */ 当普通注释:MySQL 会按版本条件执行里面的语句,复制来的语句可能引入意料外的操作
  • 用 # 注释写 PostgreSQL 语句:PG 不认 # 作为注释起始,直接报语法错误
  • 注释与 SQL 不同步:注释描述的还是旧逻辑,比没有注释更误导后来的人
  • 把优化器提示当成必然生效:需要拼写正确、位置正确且版本支持,用 EXPLAIN 验证是否被采纳

数据来源与参考

  • MySQL 8.0 Reference Manual · Comments
  • PostgreSQL Documentation · SQL Syntax · Comments
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌