无法在 MySQL 语法错误中运行查询意外
Posted
技术标签:
【中文标题】无法在 MySQL 语法错误中运行查询意外【英文标题】:Unable to Run Query in MySQL syntax error unexpected 【发布时间】:2014-09-23 13:21:31 【问题描述】:我正在运行 Workbench 5.2.47。
我写了一个很长的程序,用于基本数据检查。如果数据库中不存在记录,则插入该记录。
程序保存没有问题,但是当我尝试运行它时 mysql 5.5 抛出错误。
它很长,里面有很多公司敏感数据,或者我会在这里发布。
我正在尝试通过执行一小段代码来调试该过程,但我似乎无法让 Workbench 允许我尝试的任何操作。
MySQL 展示了如何在5.1.5 Working with Stored Procedures 中创建存储过程。
让我向您展示一些我正在尝试编写的非常基本的东西:
DELIMITER $$
DROP PROCEDURE IF EXISTS my_test;
CREATE PROCEDURE my_test()
BEGIN
SELECT * FROM Employees;
END $$
DELIMITER ;
这样,Workbench 给了我错误,“语法错误,意外 CREATE,期待 $end”。
我不明白,但我需要完成一些事情,所以我继续前进。
我做一个更简单的查询:
SET @Count=(SELECT Count(*) FROM tbl_object_users WHERE username='jp2code');
IF (@Count < 1) THEN
INSERT INTO tbl_object_users (username, date_time) VALUES ('jp2code', NOW());
END IF;
我再次收到一个错误,这次是在我的 IF 语句中。
接下来,我进入 phpMyAdmin 尝试使用它的数据库从那里运行一些东西:
SET @Count=Count(id) FROM `tbl_object_users` WHERE `username`='jp2code';
它也告诉我我的 SQL 语法有错误。
我确实下载并安装了最新的 Workbench 6,但它并没有解决问题 - 而且我不喜欢这个界面,所以我将其卸载并返回到 Workbench 5.2。
发生了什么事? SQL 并不难,那么这些障碍是怎么回事?
【问题讨论】:
您不能在过程之外使用IF
。
但是在那个截图中,你可以看到它甚至不会让我CREATE PROCEDURE my_test()
。我错过了一些基本的东西吗?
@jp2code:你缺少一些基本的东西。您告诉 MySQL 语句将以分号以外的方式终止,然后您尝试使用分号来终止语句。看我的回答。
【参考方案1】:
这个问题:
DELIMITER $$
DROP PROCEDURE IF EXISTS my_test;
CREATE PROCEDURE my_test() ...
是 MySQL 没有将 DROP PROCEDURE
语句行末尾的分号视为语句的结尾。这是因为前一行告诉 MySQL 语句终止符不是分号。你告诉 MySQL 语句将以两个美元符号结束。所以 MySQL 正在读取DROP PROCEDURE
行,寻找语句终止符。它读取的整个 blob 不是有效的 MySQL 语句,它会产生语法错误。
解决方法:将DROP PROCEDURE
行移到DELIMITER $$
行之前;或使用指定的分隔符而不是分号终止DROP PROCEDURE
语句。
您报告的第二个问题是语法错误。这是因为 MySQL 没有将 IF
识别为有效 SQL 语句的开头。
IF
语句仅在 MySQL 存储程序的上下文中有效(例如,在 CREATE PROCEDURE
语句中。)
修复:仅在 MySQL 存储程序的上下文中使用 IF
语句。
您报告的第三个问题也是语法错误。发生这种情况是因为您没有 SET
语句的有效语法;为用户变量赋值的SET
语句的MySQL语法是:
SET @uservar = expr
MySQL 期望等号后有一个 表达式。 MySQL 不期待 SQL 语句。
要将值作为SELECT
语句的结果分配给用户变量,请在 SELECT 语句中执行分配,例如:
SELECT @Count := Count(id) FROM `tbl_object_users` WHERE `username`='jp2code'
请注意,SELECT
语句中的赋值运算符是 :=
(冒号等号),而不仅仅是 =
。
【讨论】:
这是一个很棒的答案!谢谢你。SELECT @Count :=
似乎是我最大的错误。我已经使用 SQL Server 多年,但使用 MySQL 还不到 1 年。两者有很大不同!【参考方案2】:
试试这个
DELIMITER $$
DROP PROCEDURE IF EXISTS my_test$$
CREATE PROCEDURE my_test()
BEGIN
SELECT * FROM `customer_to_pay`;
END $$
DELIMITER ;
【讨论】:
+1。这确实回答了部分问题,但我标记了斯宾塞的回答,因为它解决了我遇到的所有问题。谢谢。以上是关于无法在 MySQL 语法错误中运行查询意外的主要内容,如果未能解决你的问题,请参考以下文章
GraphQLError [Object]:语法错误:无法解析意外字符“;”
GraphQLError:语法错误:无法解析意外字符“\u00A0”
Snowflake SQL 编译错误:位置 XX 处的语法错误行 XX 意外 '('