You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL执行SQL报错Error Code 1064语法错误如何解决?

MySQL 1064语法错误原因及修复方案

错误原因

你写的SQL是SQL Server的T-SQL语法,和MySQL语法不兼容,具体错误点如下:

  • 变量声明规则不兼容:MySQL中DECLARE关键字只能在存储过程、自定义函数、触发器等代码块内部使用,不能直接在普通SQL语句中声明变量;且T-SQL中@变量名的声明赋值写法MySQL不支持,MySQL自定义变量直接以@开头,无需提前声明类型,通过SET赋值即可。
  • 临时表语法不兼容:T-SQL中#表名代表局部临时表,MySQL没有该写法,临时表需要显式通过CREATE TEMPORARY TABLE语句创建,且你的代码中没有创建过#dates表,直接查询不存在的表也会报错。
  • 标识符包裹符号不兼容:T-SQL用方括号[]包裹标识符(比如[end]、[close_date]),MySQL中需要用反引号`包裹特殊标识符。
  • 日期函数不兼容:T-SQL的DATEADD函数在MySQL中对应DATE_ADD,或直接用日期 + INTERVAL 时间单位的写法;你原有代码中Dateadd(day, 1, open_date,)末尾多了多余逗号,本身就有语法错误。
  • CTE规则不兼容:MySQL 8.0以上才支持WITH语法,递归CTE还需要额外加RECURSIVE关键字,低版本MySQL不支持CTE特性;你的写法是SQL Server的CTE规则,直接在MySQL执行会报错。
  • 逻辑断层:你前面创建了bugs表,但后续CTE逻辑没有用到bugs表,反而直接查询不存在的#dates表,逻辑不连贯。

修复方案

假设你的需求是生成bugs表中open_date到最大close_date之间的连续日期,以下是适配不同版本MySQL的可执行代码:

适配MySQL 8.0+版本

-- 创建测试bugs表
CREATE TABLE IF NOT EXISTS bugs (id int, open_date DATETIME, close_date DATETIME, severity int);
INSERT INTO bugs VALUES 
(0, '2012-01-01', '2012-01-03',3), 
(1,'2012-01-03', '2012-01-07',1), 
(2,'2012-01-01', '2012-01-05',3), 
(3,'2012-01-01', '2012-01-05',3), 
(4,'2012-01-01', '2012-01-05',3);

-- 赋值最大日期变量
SET @maxdate = (SELECT Max(close_date) FROM bugs);

-- 递归CTE生成连续日期,MySQL递归CTE必须加RECURSIVE关键字
WITH RECURSIVE cte AS (
    SELECT MIN(open_date) as cdate
    FROM bugs
    UNION ALL
    SELECT cdate + INTERVAL 1 DAY
    FROM cte
    WHERE cdate < @maxdate
)
-- 此处可根据需求关联bugs表做统计,比如计算每日活跃bug数
SELECT * FROM cte;

适配MySQL 5.7及以下低版本

如果你的MySQL版本不支持CTE,可使用临时表生成连续日期:

CREATE TABLE IF NOT EXISTS bugs (id int, open_date DATETIME, close_date DATETIME, severity int);
INSERT INTO bugs VALUES 
(0, '2012-01-01', '2012-01-03',3), 
(1,'2012-01-03', '2012-01-07',1), 
(2,'2012-01-01', '2012-01-05',3), 
(3,'2012-01-01', '2012-01-05',3), 
(4,'2012-01-01', '2012-01-05',3);

SELECT MIN(open_date) into @mindate FROM bugs;
SELECT MAX(close_date) into @maxdate FROM bugs;

-- 生成连续日期临时表
CREATE TEMPORARY TABLE dates (cdate DATE);
WHILE @mindate <= @maxdate DO
    INSERT INTO dates VALUES (@mindate);
    SET @mindate = @mindate + INTERVAL 1 DAY;
END WHILE;

SELECT * FROM dates;

内容的提问来源于stack exchange,提问作者weinfZer0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:57:04