首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unable to Run Query in MySQL语法错误意外

问Unable to Run Query in MySQL语法错误意外
EN

Stack Overflow用户
提问于 2014-07-31 22:31:42
回答 2查看 14.4K关注 0票数 3

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

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

它很长,里面有很多公司敏感数据,否则我会把它贴在这里。

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

MySQL展示了如何在5.1.5 Working with Stored Procedures中创建存储过程。

让我向你展示一些我正在尝试写的非常基本的东西:

代码语言:javascript
复制
DELIMITER $$
DROP PROCEDURE IF EXISTS my_test;

CREATE PROCEDURE my_test()
BEGIN
    SELECT * FROM Employees;
END $$

DELIMITER ;

这样,工作台就会给我一个错误,“语法错误,意外创建,期望$end”。

​

​

我不明白,但我需要完成一些事情,所以我要继续前进。

我做了一个更简单的查询:

代码语言:javascript
复制
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,尝试使用它的数据库从那里运行一些东西:

代码语言:javascript
复制
SET @Count=Count(id) FROM `tbl_object_users` WHERE `username`='jp2code';

它也告诉我,我的SQL语法中有一个错误。

​

​

我确实下载并安装了最新的Workbench 6,但它没有解决问题--而且我不喜欢它的界面,所以我卸载了它并返回到Workbench 5.2。

怎么一回事?SQL并不那么难,那么这些障碍是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-31 22:40:26

这方面的问题:

代码语言:javascript
复制
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语句的开头。

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

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

代码语言:javascript
复制
SET @uservar = expr 

MySQL需要在等号后面有一个表达式。MySQL不需要SQL语句。

要为用户变量赋值作为SELECT语句的结果,请在SELECT语句中进行赋值,例如:

代码语言:javascript
复制
SELECT @Count := Count(id) FROM `tbl_object_users` WHERE `username`='jp2code'

注意,不仅仅是=.,SELECT语句中的赋值操作符是:= (冒号等于)

票数 7
EN

Stack Overflow用户

发布于 2014-07-31 22:41:14

尝尝这个

代码语言:javascript
复制
DELIMITER $$

DROP PROCEDURE IF EXISTS my_test$$

CREATE PROCEDURE my_test()
BEGIN
    SELECT * FROM `customer_to_pay`;
END $$

DELIMITER ;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25061585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档