[英]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.