易君召
易君召
发布于 2026-10-22 / 9 阅读
0

SQL 文件高频语法错误汇总

按类别整理,同时附带错误示例、原因、修正写法,覆盖 MySQL / PostgreSQL /openGauss/ 达梦 等常见库。

说明:有些属于语法兼容问题(A 库合法、B 库报错),很多人会当成语法错误。

一、符号、引号、分号类(最高发)

  1. 漏写 / 多写分号 ;

-- 错误:少分号,语句粘连
select * from user
insert into user(name) values('a');
-- 错误:存储过程/函数体内多余分号,配合 DELIMITER 时踩坑
DELIMITER ;
CREATE PROC p()
BEGIN
  select 1;
END;
DELIMITER ;

MySQL 导入脚本最经典坑:写存储过程前忘记改分隔符 DELIMITER //

  1. 单双引号混用、中文引号(全角)

-- 错误:全角引号 “ ” ‘ ’
select * from t where name = “张三”;
-- 错误:PostgreSQL 字符串必须单引号,双引号是标识符
select * from t where name = "张三";

✅ 规则:字符串值用半角单引号 ';标识符(表名 / 字段名)MySQL 反引号 `,PG/openGauss 双引号 "

  1. 字符串内单引号没有转义

-- 错误:内容包含单引号,截断SQL
insert into t(remark) values('it's ok');
-- 正确:两个单引号转义
insert into t(remark) values('it''s ok');
  1. 注释符号不规范

-- 错误:# 注释只MySQL支持,PG/Oracle不识别
# 这是注释
-- 错误:/* 多行注释没有闭合
/* select * from t

二、标识符、关键字、保留字问题

  1. 表名 / 字段名是 SQL 保留字,没加转义符

-- error:order、desc、user、group、status 很多是关键字
select order from t;
-- mysql:
select `order` from t;
-- pg/openGauss:
select "order" from t;

常见高危保留字:order、group、user、desc、limit、offset、table、values、primary

  1. 表名、字段名带空格、特殊字符未转义

-- 错误
select user name from t;
-- mysql
select `user name` from t;

三、DML 语句(INSERT / UPDATE / DELETE / SELECT)

  1. INSERT 字段列表和值列表数量不一致

-- 字段3个,值只有2个
insert into t(a,b,c) values(1,2);
  1. VALUES 多行写法逗号写错

-- 错误:行之间用分号而不是逗号
insert t(a) values (1);(2);
-- 正确
insert t(a) values (1),(2);
  1. UPDATE 忘记 WHERE(不是语法错,是逻辑灾难),或者 WHERE 条件写错

update user set name='xxx'; -- 全表更新!
  1. 聚合函数不在 GROUP BY 里(ONLY_FULL_GROUP_BY 模式报错)

-- mysql 开启严格模式报错
select id,name,max(score) from student group by id;
  1. JOIN 语法错误:缺少 ON、逗号和 JOIN 混用混乱

-- 错误
select * from a join b where a.id=b.a_id;
-- 标准写法
select * from a join b on a.id=b.a_id;
  1. LIMIT / OFFSET 参数非数字、负数

select * from t limit -10;

四、DDL 语句(CREATE / ALTER / DROP)高频错

  1. 主键、唯一键重复定义;主键字段允许 NULL

-- 错误:主键不能 null
create table t(id int primary key null);
  1. 数据类型写错、长度非法

-- mysql:varchar 不能负数、超大长度
name varchar(-10)
  1. ALTER 修改不存在的字段 / 删除不存在的索引

alter table t drop column xxx; -- 字段不存在
  1. 外键约束:引用表 / 字段不存在、类型不一致、引擎不支持(MyISAM 无外键)

foreign key (uid) references user(uid)
-- 坑:两个字段字符集、int长度不一致,直接创建失败
  1. DEFAULT 默认值类型不匹配

create table t(
  status int default 'abc'
);

五、函数、存储过程、触发器、变量语法

  1. 函数参数、返回类型写错,缺少 RETURN

CREATE FUNCTION f() RETURNS INT
BEGIN
  SELECT 1;
END; -- 缺少 return
  1. 变量声明位置错误(必须在最开头 DECLARE)

BEGIN
  select 1;
  declare v int; -- 错误,declare要在所有语句之前
END
  1. 赋值语法混淆:= 和 := MySQL 存储过程里 = 在 where 里是比较,赋值推荐 :=

set v = 1; -- set语法里可以
select v := 1;
  1. 触发器 OLD/NEW 使用错误:INSERT 没有 OLD,DELETE 没有 NEW

六、导入 SQL 文件时特有的坑(看着像语法错,实际是环境问题)

  1. 编码问题:文件 UTF8-BOM 头部 文件开头带 BOM 不可见字符,数据库解析第一行直接报语法错误,肉眼看不到。 ✅ 解决:编辑器另存为 UTF-8(无 BOM)

  2. 换行符问题 Windows CRLF / Linux LF 少数老驱动、国产库解析 \r 当成非法字符报错。

  3. SQL_MODE 严格模式差异 MySQL sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,本地能跑,线上报错。

  4. 注释里包含特殊字符、; 干扰解析器

-- 导出脚本注释里写:删除表;测试
DROP TABLE IF EXISTS t;

导入工具按 ; 切割,容易切错。

  1. 扩展语法跨库不兼容(非常常见,属于 “移植报错”)

    写法

    MySQL

    PG/openGauss

    Oracle

    LIMIT

    ✅

    ✅

    ❌ 用 ROWNUM

    AUTO_INCREMENT

    ✅

    ❌ identity/sequence

    ❌ sequence

    backtick ``

    ✅

    ❌

    ❌

    IFNULL()

    ✅

    ❌ COALESCE

    ❌ NVL

    DATE_ADD()

    ✅

    ❌ interval

    ❌

七、事务、锁、脚本控制语句错误

-- 错误:commit / rollback 拼写错误;begin 和 start transaction混用
beginn;
-- 错误:SAVEPOINT 名字不存在
rollback to sp1;

八、快速自查清单(你校验 sql 文件时可以对照)

  1. 文件编码 UTF-8 无 BOM

  2. 全部是半角符号,没有中文引号逗号

  3. 字符串单引号正确转义

  4. 关键字字段都加标识符包裹(反引号 / 双引号)

  5. 存储过程提前设置 DELIMITER

  6. 每条语句 ; 位置正确

  7. 多行 INSERT 值逗号分隔正确

  8. DDL 外键两边字段类型、字符集一致

  9. 区分数据库方言:不要把 MySQL 语法直接丢 PG / 达梦


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/sql-file-common-syntax-errors-guide

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/