【发布时间】:2010-09-01 17:25:44
【问题描述】:
我想知道如何在 MySQL 存储过程中使用 DROP TABLE IF EXISTS。
我正在编写一个相当长的 mySQL 存储过程,它将完成大量工作,然后加载一个带有结果的临时表。但是,我无法完成这项工作。
我已经看到了几种处理临时表的方法。基本上,您要么创建临时表,对其进行处理,然后在最后删除它......或者如果它存在,则删除它,创建它,然后对其进行处理。
我更喜欢第二种方法,这样你总是从干净的开始,它是对表存在的内置检查。但是,我似乎无法让它工作:
这是我的例子:
这行得通:
DELIMITER//
DROP PROCEDURE IF EXISTS pTest//
CREATE PROCEDURE pTest()
BEGIN
CREATE TEMPORARY TABLE tblTest (
OrderDate varchar(200)
);
DROP TEMPORARY TABLE tblTest;
END//
DELIMITER ;
CALL pTest();
这行得通:
DELIMITER//
DROP PROCEDURE IF EXISTS pTest//
CREATE PROCEDURE pTest()
BEGIN
DROP TEMPORARY TABLE tblTest;
CREATE TEMPORARY TABLE tblTest (
OrderDate varchar(200)
);
END//
DELIMITER ;
CALL pTest();
这不是:
DELIMITER//
DROP PROCEDURE IF EXISTS pTest//
CREATE PROCEDURE pTest()
BEGIN
DROP TEMPORARY TABLE IF EXISTS tblTest;
CREATE TEMPORARY TABLE tblTest (
OrderDate varchar(200)
);
END//
DELIMITER ;
CALL pTest();
前 2 个有效,但如果该表存在(例如,如果过程未完成或其他情况),它显然会以“表 tblTest 不存在”错误结束。非工作示例是我正在寻找的 - 如果表在那里,则删除表,然后重新创建它,以便我可以开始清理。
感觉就像是“如果存在”让这件事失败了。我已经从各种做事非常相似的网站复制了代码,在任何情况下我都无法获得“如果存在则删除表......”来工作。永远。
开发服务器:mySQL 服务器版本:5.1.47-community 产品服务器:mySQL 服务器版本:5.0.45-log
我们无法更改数据库版本(DBA 不允许),所以我只能坚持现有的。这是 mySQL 还是过程中的错误?
谢谢。
【问题讨论】:
-
我可能应该发布我得到的实际错误... [Err] 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '// DELIMITER 附近使用的正确语法;在第 7 行调用 pTest()' 只需删除“IF EXISTS”即可消除错误并且整个过程都可以正常工作(当然,除非该表不存在;)