2010-09-01 44 views
14

我想知道如何在MySQL存储过程中使用DROP TABLE IF EXISTS。 我正在写一个相当长的mySQL存储过程,将做一堆的工作,然后加载一个临时表与结果。但是,我无法完成这项工作。如何在MySQL存储过程中使用DROP TABLE IF EXTERNTS

我见过几种方法来做临时表的事情。基本上,您可以创建临时表,对其进行处理,然后将其放在最后......如果存在,则创建它,然后在其上进行工作。

我更喜欢第二种方法,以便始终保持清洁,并且它是对表格存在的内置检查。不过,我似乎无法得到它的工作:

这里是我的例子:

这个工程:

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不存在”错误结束。非工作的例子就是我正在寻找的东西 - 把它放在那里,然后重新创建它,这样我就可以开始清理了。

感觉就像是“IF EXISTS”使这件事情失败。我已经复制了各种类似网站的代码,并且在任何情况下都无法获得“DROP TABLE IF EXISTS ...”的效果。永远。

开发服务器:MySQL服务器版本:5.1.47社区 PROD服务器:MySQL服务器版本:5.0.45日志

我们不能改变数据库的版本(数据库管理员不会允许它),这样我被困在我所拥有的东西上。这是一个在MySQL或程序中的错误?

谢谢。

+0

我也许应该已经发布了实际的错误,我得到的... [错误] 1064 - 你有一个错误的SQL语法;检查与您的MySQL服务器版本相对应的手册,以在'// DELIMITER; 第7行的CALL pTest()' 简单地删除“IF EXISTS”消除了错误,整个proc工作(当然,除非该表不存在;) – 2010-09-02 15:15:38

回答

1

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

试试这个:

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(); 
+0

运行那个精确的语句给了我同样的错误: [错误] 1064 - 您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以在'// DELIMITER; CALL pTest()'在第10行 – 2010-09-02 15:17:59

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()); 
} 

你抑制以@符号第一次查询的错误,所以你不必干扰错误,然后删除该表时,查询将返回错误。

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 ;