如何在MySQL存储过程中使用DROP TABLE IF EXISTS

时间:2010-09-01 17:25:44

标签: mysql stored-procedures

我想知道如何在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();

前两个工作,但如果该表存在(如果该过程没有完成或某事),它显然会以“表tblTest不存在”错误结束。我正在寻找的非工作示例 - 如果它在那里删除表,然后重新创建它,以便我可以开始清理。

感觉就像是“IF EXISTS”让这件事失败了。我从各种非常相似的网站复制了代码,但在任何情况下我都无法获得“DROP TABLE IF EXISTS ...”。如初。

Dev Server:mySQL Server版本:5.1.47-community 产品服务器:mySQL服务器版本:5.0.45-log

我们无法更改数据库版本(DBA不会允许它),所以我坚持我所拥有的。这是mySQL或Procedure中的错误吗?

感谢。

4 个答案:

答案 0 :(得分:16)

这是一个老问题,但是当我正在寻找DROP TABLE IF EXISTS时,它出现了。

您的非工作代码无法在我的MySQL 5.1.70服务器上运行。

我所要做的只是在第一行的DELIMITER和//之间添加一个空格,一切正常。

工作代码:

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 ;

答案 1 :(得分:2)

我也有同样的问题。似乎MySQL不喜欢检查表是否存在于某些版本或某些版本上。我首先通过查询数据库解决了这个问题,如果我找到了一个表,我就把它丢弃了。使用PHP:

$q = @mysql_query("SELECT * FROM `$name`");
if ($q){
    $q = mysql_query("DROP TABLE `$name`");
    if(!$q) die('e: Could not drop the table '.mysql_error());
}

使用@符号抑制第一个查询中的错误,因此您没有干扰错误,然后在查询返回false时删除该表。

答案 2 :(得分:1)

我不知道为什么这不适合你,但是你应该能够使用continue处理程序来解决这个问题。如果将DROP TABLE语句放入其自己的BEGIN...END块中,则可以使用continue处理程序在表不存在时忽略该错误。

试试这个:

DELIMITER //
    DROP PROCEDURE IF EXISTS pTest //
    CREATE PROCEDURE pTest()
    BEGIN
      BEGIN
        DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' BEGIN END;
        DROP TEMPORARY TABLE tblTest;
      END;
        CREATE TEMPORARY TABLE tblTest (
            OrderDate varchar(200)
        );
    END //
 DELIMITER ;
CALL pTest();

答案 3 :(得分:0)

我建议添加新行

SET sql_notes = 0// before DROP PROCEDURE IF EXISTS get_table //

否则会显示警告PROCEDURE不存在。

相关问题