2010-09-01 47 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 ;