无法在 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”

GraphQLError:语法错误:无法解析意外字符“。”

Snowflake SQL 编译错误:位置 XX 处的语法错误行 XX 意外 '('

查询中的 SQL 变量导致意外的 SQL 语法错误 [重复]

MySQL语法错误(查询在mysql中运行得很好但不知何故最终在jsp中出错)