簡體   English   中英

MySQL IF語句 - 有錯誤的腳本

[英]MySQL IF Statement - script with error

我正在創建一個MySQL更新腳本,它允許我使用時間戳將我的所有sql更改合並到多個數據庫,以確定哪些更改已經更新。

我已將@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 

任何幫助將不勝感激。

問題是IF控制流構造只能在存儲過程中工作(就像所有其他流控制構造一樣 ......所以你需要定義一個程序來做你要求的...

所以這里是如何定義樣本過程來做你想要的:

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

有關詳細信息,請參閱文檔

實際上,您甚至可以使用參數,因此您無需對所有內容進行硬編碼。 但我不確定你會如何根據你提供的內容做到這一點(我不確定你究竟想要完成什么)......

如果你想讓它將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 ,而不是因為它們是必要的)...

您只能在存儲過程或函數中使用流控制結構。 證明鏈接

試一試吧。

而不是這個:

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

像這樣:

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

不確定MySql,但這是我在MS SQL中所做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM