无法在 MySQL 中运行查询语法错误意外

2024-05-08

我正在运行工作台 5.2.47。

我写了一个很长的程序,用于基本数据检查。如果数据库中不存在记录,则将插入该记录。

该过程保存时没有任何问题,但当我尝试运行它时,MySQL 5.5 抛出错误。

它很长,里面有很多公司敏感数据,或者我会把它发布在这里。

我试图通过执行小块代码来调试该过程,但我似乎无法让工作台允许我尝试任何操作。

MySQL 展示了如何创建存储过程5.1.5 使用存储过程 http://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html.

让我向您展示我正在尝试写的一些非常基本的内容:

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 并不难,那么这些障碍是什么呢?


问题在于:

DELIMITER $$
DROP PROCEDURE IF EXISTS my_test;
CREATE PROCEDURE my_test() ...

是 MySQL 没有看到末尾的分号DROP PROCEDURE语句行作为语句的结尾。这是因为前一行告诉 MySQL 语句终止符不是分号。您告诉 MySQL 语句将以两个美元符号结束。所以 MySQL 正在读取DROP PROCEDURE行,寻找语句终止符。它读取的整个 blob 不是有效的 MySQL 语句,它会生成语法错误。

解决方法:要么移动DROP PROCEDURE line before the DELIMITER $$线;或终止DROP PROCEDURE使用指定分隔符而不是分号的语句。


您报告的第二个问题是语法错误。发生这种情况是因为 MySQL 无法识别IF作为有效 SQL 语句的开头。

The IF声明有效only在 MySQL 存储程序的上下文中(例如,在CREATE PROCEDURE陈述。)

修复方法:使用IF语句仅在 MySQL 存储程序的上下文中。


您报告的第三个问题也是语法错误。发生这种情况是因为您没有有效的语法SET陈述; MySQL 语法为SET给用户变量赋值的语句是:

SET @uservar = expr 

MySQL 正在等待表达在等号之后。 MySQL 是not期待 SQL 语句。

将值作为结果分配给用户变量SELECT语句,在 SELECT 语句内进行赋值,例如:

SELECT @Count := Count(id) FROM `tbl_object_users` WHERE `username`='jp2code'

注意里面的赋值运算符SELECT声明是:=(冒号等于),不仅仅是=.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 MySQL 中运行查询语法错误意外 的相关文章