【问题标题】:How to use DROP TABLE IF EXISTS in a MySQL Stored Procedure如何在 MySQL 存储过程中使用 DROP TABLE IF EXISTS
【发布时间】: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”即可消除错误并且整个过程都可以正常工作(当然,除非该表不存在;)

标签: mysql stored-procedures


【解决方案1】:

这是一个老问题,但在我寻找 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 ;

【讨论】:

    【解决方案2】:

    我不知道为什么这对您不起作用,但您应该能够使用 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();
    

    【讨论】:

    • 运行那个确切的语句给了我同样的错误:[Err] 1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '// DELIMITER 附近使用的正确语法;在第 10 行调用 pTest()'
    【解决方案3】:

    我也遇到了同样的问题。似乎 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 时删除表。

    【讨论】:

      【解决方案4】:

      我建议添加新行

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2012-09-29
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多