我正在创建一个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
非常感谢任何帮助。
答案 0 :(得分:2)
问题是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
,而不是因为它们是必要的)...
答案 1 :(得分:0)
您只能在存储过程或函数中使用流控制结构。 proof link
答案 2 :(得分:-2)
试一试。
而不是:
SET @cv = (SELECT `value` FROM `configs` WHERE `name` = 'cvDat');
像这样:
SELECT @cv = `value` FROM `configs` WHERE `name` = 'cvDat';
对MySql不确定,但这就是我在MS SQL中所做的。