MySQL 不接受这个过程。你能帮忙吗?
Posted
技术标签:
【中文标题】MySQL 不接受这个过程。你能帮忙吗?【英文标题】:MySQL does not accept this procedure. Can you help, please? 【发布时间】:2012-12-04 12:12:46 【问题描述】:CREATE PROCEDURE reset_xyz_autoincrement
BEGIN
SELECT @max := MAX(ID)+ 1 FROM ABC;
PREPARE stmt FROM 'ALTER TABLE XYZ AUTO_INCREMENT = ?'
EXECUTE stmt USING @max
DEALLOCATE PREPARE stmt;
END $$
我从这里获取了代码: How to Reset an mysql AutoIncrement using a MAX value from another table?
这是 MySQL 输出:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN
SELECT @max := MAX(ID)+ 1 FROM ABC' at line 2
【问题讨论】:
【参考方案1】:试试这个
CREATE PROCEDURE reset_xyz_autoincrement
(username varchar(64),password varchar(64)) // here you use your columns
BEGIN
编辑:
试试这个
DROP PROCEDURE IF EXISTS reset_xyz_autoincrement;
CREATE PROCEDURE reset_xyz_autoincrement (userid INT)
BEGIN
【讨论】:
还是没有运气。我在第 3 行的 '' 附近出现错误SELECT @curID := MAX(movies.id) FROM movies;
现在错误不在开始附近,所以它修复了第一个错误,然后错误现在在 SELECT 中
查询不在程序中时正常运行。我的意思是它输出正确的东西,但在过程中它失败了......
确保您的真实表中的reset_xyz_autoincrement
和ABC
和XYZ
是三个不同的表【参考方案2】:
你应该遵循:
-
使用函数大括号
每条语句使用分号。
分隔符 $$ 创建过程 reset_xyz_autoincrement() 开始
SELECT @max:=MAX(ID)+ 1 FROM Company_Master; PREPARE stmt FROM 'ALTER TABLE Dept_Master AUTO_INCREMENT = ?'; EXECUTE stmt USING @max ; DEALLOCATE PREPARE stmt; END$$
【讨论】:
【参考方案3】:尝试在CREATE PROCEDURE
语句之前添加delimiter $$
。
编辑:
我在 cmets 中丢失了您的程序的当前版本,但您的 SELECT
声明中有错误:
SELECT @yourVar := MAX(ID)+ 1 FROM ABC;
应该变成
SELECT MAX(ID) + 1 INTO @yourVar FROM ABC;
另外,我认为您应该先DECLARE myVar INT
(假设它是一个整数),请注意max
也是一个 MySQL 关键字,所以我会避免在我的过程中使用该名称。
【讨论】:
我在发帖前就试过了,但还是没有成功。我又得到了错误:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN SELECT @max := MAX(id)+ 1 FROM movies; PREPARE stmt FROM 'ALTER TABL' at line 2
我也用delimiter ;
尝试过,也没有运气......以上是关于MySQL 不接受这个过程。你能帮忙吗?的主要内容,如果未能解决你的问题,请参考以下文章
你能帮忙把这个非常小的 C++ 组件翻译成 Delphi 吗?