2009-04-21 28 views
16

我需要編寫用於MySQL的安裝腳本(通常使用mysql控制檯中的'source [file]'運行),部分依賴於現有數據,環境也有所不同,這意味着有時腳本確實會失敗。一個常見的情況是,帶有select(找到一個id)的'SET'語句找不到任何東西;控制檯將值設置爲NULL。在這種情況下,我希望腳本失敗;我聽說這將通過提出錯誤(與其他數據庫)來完成。但是,似乎MySQL沒有辦法做到這一點。中止MySQL腳本執行的方式(可能引發錯誤)?

在這種情況下是否有好的方法來強制失敗?現在情況是,當插入嘗試使用null時,更新將失敗,但即使這樣也不會終止腳本本身。理想情況下,只要遇到問題,就會失敗並終止。

+1

似乎是重複的:http://stackoverflow.com/questions/465727/raise-error-within-mysql-function/466826 – 2009-04-23 20:34:31

+0

嗯。它是相關的,但我不確定它是一個dup,因爲我從mysql控制檯運行sql,並沒有存儲過程。但是,也許我誤解了這裏的差異(控制檯只是基本上運行與存儲過程一樣的方式執行?)。 非常感謝您的鏈接。 – StaxMan 2009-04-24 18:17:15

+1

可能有新的選項可以進來MySQL 6請參閱http://bugs.mysql.com/bug.php?id=35634 – KCD 2012-03-28 21:23:59

回答

7

我想你遇到的是MySQL控制檯的侷限性。給定一個語句列表,MySQL控制檯執行每個語句,而不管生成的任何錯誤。即使你實現了前面提到的一些錯誤提示建議,當遇到這樣的錯誤時,MySQL控制檯也不會停止執行。

我假設您沒有資源將腳本語言應用於可以爲您執行SQL並處理錯誤的問題。我認爲在這種情況下,你只需要一個比MySQL控制檯更強大的工具。

MySQL Administrator做你所需要的,如果我正確地理解你的問題。如果你設置你的MySQL連接並連接到數據庫,你可以在工具菜單中找到兩個工具。正常的MySQL控制檯在那裏,但你也有MySQL查詢瀏覽器。

如果你打開查詢瀏覽器,你會得到一個像樣的你的MySQL數據庫的GUI視圖。文件 - >打開腳本打開你的SQL腳本,然後使用執行按鈕。

你會得到一個不錯的進度條,更重要的是它的聲音,如果查詢失敗,腳本執行暫停並突出顯示失敗的查詢。您可以選擇跳過它並繼續前進,甚至可以手動修改數據,並從腳本更遠的其他位置啓動。

我幾乎立即發現了並且嘗試了管理員後就放棄了MySQL控制檯。

13

我有同樣的問題,GUI不適合我。下面是我如何解決它:

DELIMITER $$ 

    DROP FUNCTION IF EXISTS sfKillConnection $$ 

    CREATE FUNCTION sfKillConnection() RETURNS INT 
    BEGIN 

     SELECT connection_id() into @connectionId; 
     KILL @connectionId; 
     RETURN @connectionId; 
    END $$ 


    DELIMITER ; 

這是一個函數,而不是一個過程,以便它可以在腳本中調用這樣的:

select if(@error, sfKillConnection(), 0); 

你可能需要與啓動MySQL客戶端--disable-reconnect選項。

2

只有在某個特定版本到位的情況下,才能執行升級命令。

這是醜陋的,但它是我可以爲MySQL 5建議的。

DELIMITER $$ 
DROP FUNCTION IF EXISTS `Upgrade_Build`$$  
CREATE FUNCTION `Upgrade_Build`(bversion INT) RETURNS varchar(30) 
BEGIN 
    IF bversion = (SELECT MIN(`db_version`) FROM `system`) THEN 
    UPDATE `pages` 
     SET `component_parameters` = 
     REPLACE(`component_parameters`,'folderviewer_','folder_viewer.'); 
    UPDATE `system` 
     SET `db_version` = bversion+1; 
    return CONCAT('Success: ',bversion,' > ',bversion+1); 
    ELSE 
    return CONCAT('Failed - Version is ',(SELECT MIN(`db_version`) FROM `system`)); 
    END IF; 
END$$ 
DELIMITER ; 

要使用它,這樣做:

SELECT Upgrade_Build(1327); 

你會看到這樣的事情,如果當前版本是1327:

成功:1327> 1328

運行這是第二次,你會看到:

失敗 - 版本是1328

希望這對某人有用。

0

這裏有一個低額的方法:

我需要確保@search_admin_realname對應於profiles表中的記錄;如果不是,我想放棄我的劇本。

所以我這樣做:

select @search_admin_id:= userid 
from profiles 
where [email protected]_admin_realname 
; 
# test that @search_admin_id is not null; 
# if it is, then the insert will fail and script will abort. 
create temporary table t_search_admin_id (search_admin_id mediumint(9) not null); 
insert into t_search_admin_id (search_admin_id) values (@search_admin_id); 

唯一的缺點是,我真的不能自定義錯誤消息:(

5

MySQL工作臺現在取代MySQL管理

使用「觸發。在失敗語句後是否應繼續執行SQL腳本'

Toggle whether execution of SQL script should continue after failed statements