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
相关产品推荐
相关产品推荐

