【问题标题】:MySQL IF Statement - script with errorMySQL IF 语句 - 有错误的脚本
【发布时间】:2011-05-12 00:22:56
【问题描述】:

我正在创建一个 MySQL 更新脚本,它允许我使用时间戳将我的所有 sql 更改合并到多个数据库,以确定哪些更改已经更新。

我已将@cv 设置为数据库的当前版本。问题出现在if statement。我将 IF 语句更改为它会导致 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 

任何帮助将不胜感激。

【问题讨论】:

  • @cv 只是一个结果值还是一个“结果集”,我的意思是即使你只选择一行和一个元素,也许@cv 成为一个完整的结果而不是一个可比较的值?还没有这样做,所以我只是在头脑风暴
  • 是否有可能因为 'type' 列不存在而无法验证 Alter Table 的第二个子句?或者,如果您删除 Alter Table 子句但保留 IF 会发生什么?

标签: php mysql if-statement conditional


【解决方案1】:

问题在于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,不知道谁做了负-1。你能给 OP 一个非常简单的存储过程示例吗?
  • 我仍然想知道为什么所有-1 都在此线程中投票。我的意思是 4 -1 票,没有一个答案是坏的(恕我直言)......
【解决方案2】:

您只能在存储过程或函数中使用流控制结构。 proof link

【讨论】:

  • +1 取消 -1(因为提供的信息似乎是答案)...
【解决方案3】:

试试这个吧。

而不是这个:

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

把它变成这样:

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

不确定 MySql,但这是我在 MS SQL 中所做的。

【讨论】:

  • Op 说问题出在 IF 语句上
  • MySQL完全支持SET syntax,只要select只返回1行...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 2017-04-28
相关资源
最近更新 更多