MySQL IF语句 - 有错误的脚本

时间:2010-11-18 12:35:48

标签: php mysql if-statement conditional

我正在创建一个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 

非常感谢任何帮助。

3 个答案:

答案 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中所做的。