2010-11-18 64 views
3

我是創建一個MySQL更新腳本,它允許我使用時間戳將所有sql更改合併到多個數據庫,以確定哪些更改已被更新。MySQL IF語句 - 腳本有錯誤

我已經將@cv設置爲當前版本的數據庫。該問題發生在if statement。我將IF語句更改爲它會導致翻倒。

SET @cv = (SELECT `value` FROM `configs` WHERE `name` = 'cvDate'); 

IF @cv <= STR_TO_DATE("2010/11/10 12:15:00") THEN 
    ALTER TABLE `feeds` ADD `tone` VARCHAR(255) NOT NULL AFTER `type` , 
    ADD `authority` DECIMAL(2, 1) NOT NULL DEFAULT '0.0' AFTER `tone`; 
END IF; 

UPDATE `configs` SET `value` = NOW() WHERE `name` = "cvDate"; 

我得到的錯誤是:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF @cv <= STR_TO_DATE("2010/11/10 12:15:00") THEN ALTER TABLE `feeds` ADD `to' at line 1 

任何幫助將不勝感激。

+0

@cv只是一個結果值,或者它是「結果集」,我的意思是即使你只選擇一行和一個元素,也許@cv變成了一個完整的結果而不是可比的值?沒有這樣做,所以我只是頭腦風暴 – Tobias 2010-11-18 13:40:56

+0

Alter Table的第二個子句可能無法驗證,因爲'type'列不存在嗎?或者,如果刪除Alter Table子句但離開IF,會發生什麼情況? – 2010-11-18 13:48:03

回答

3

的問題是,IF控制流結構只適用於存儲過程(就像所有其他Flow Control Constructs ...所以你需要定義一個程序做什麼你問...

因此,這裏是如何定義樣本程序做你想要什麼:

DELIMITER // 
CREATE PROCEDURE myProcedure() 
BEGIN 
    SET @cv = (SELECT `value` FROM `configs` WHERE `name` = 'cvDate'); 

    IF @cv <= STR_TO_DATE("2010/11/10 12:15:00") THEN 
     ALTER TABLE `feeds` ADD `tone` VARCHAR(255) NOT NULL AFTER `type` , 
      ADD `authority` DECIMAL(2, 1) NOT NULL DEFAULT '0.0' AFTER `tone`; 
    END IF; 

    UPDATE `configs` SET `value` = NOW() WHERE `name` = "cvDate"; 
END// 
DELIMITER ; 

,將創建它,然後運行它,只是做:

CALL myProcedure(); 

有關更多信息,請參閱the docs

實際上甚至可以讓它帶參數,因此不需要對所有內容進行硬編碼。但我不知道你將如何做到這一點基於你提供的(我不知道你到底想要完成什麼)...

如果你想讓它作爲一個sql語句參數(使用Prepared Statements):

DELIMITER // 
CREATE PROCEDURE myInputProcedure(IN updateDate DATETIME, IN sql TEXT) 
BEGIN 
    SET @cv = (SELECT `value` FROM `configs` WHERE `name` = 'cvDate'); 

    IF @cv <= updateDate THEN 
     PREPARE stmt1 FROM sql; 
     EXECUTE stmt1; 
    END IF; 

    UPDATE `configs` SET `value` = NOW() WHERE `name` = "cvDate"; 
END// 
DELIMITER ; 

然後,只需調用它是這樣的:

@sql = 'ALTER TABLE `feeds` ADD `tone` VARCHAR(255) NOT NULL AFTER `type` , 
      ADD `authority` DECIMAL(2, 1) NOT NULL DEFAULT '0.0' AFTER `tone`;'; 
@date = STR_TO_DATE("2010/11/10 12:15:00"); 
CALL myInputProcedure(@date, @sql); 

(請注意,我說@sql@date的可讀性,而不是因爲他們是必要的)...

+0

照顧解釋-1? – ircmaxell 2010-11-18 14:04:05

+0

我做了+1,不知道誰做了-1。你可以給OP一個存儲過程的簡單例子嗎? – Lizard 2010-11-18 14:05:15

+0

不錯非常有幫助! – Lizard 2010-11-18 14:27:01

-2

只要試一試。

取而代之的是:

SET @cv = (SELECT `value` FROM `configs` WHERE `name` = 'cvDat'); 

讓這樣的:

SELECT @cv = `value` FROM `configs` WHERE `name` = 'cvDat'; 

不知道的MySQL,但是這是我在MS SQL做。

+0

Op說,問題出在IF語句 – Lizard 2010-11-18 13:53:43

+0

MySQL完全支持['SET'語法](http://dev.mysql.com/doc/refman/5.1/en/set-option.html),只要作爲選擇只返回1行... – ircmaxell 2010-11-18 13:55:38

0

只能在存儲過程或函數中使用流控制結構。 proof link

+0

+1取消了-1(因爲提供的信息似乎確實是答案)... – ircmaxell 2010-11-18 13:54:03