PhpMyAdmin - 错误1064 - 在函数

时间:2015-05-04 09:07:59

标签: phpmyadmin mysql-error-1064

我很难用PhpMyAdmin。 我的表是:

material(id_item, id_collection,...)
primarey_key(id_item, id_collection).

我想创建一个函数来阻止非循环图数据库中的循环。所以我想强制id_collection> id_item用于新的id_collection。

我的功能是(我在SQL标签中设置了//):

    //

CREATE or REPLACE function collections_prevent_cycle()
 BEGIN
    DECLARE max_of_both SMALLINT;
    SET max_of_both := (MAX(GREATEST(id_item, id_collection)) FROM material);

    IF NOT EXISTS(SELECT id_collection FROM material where id_collection = NEW.id_collection) THEN
        IF (NEW.id_item >= max_of_both) THEN SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'You may not insert items that doesnt exist';

        ELSEIF(NEW.id_collection <> max_of_both + 1) THEN SIGNAL'45000'
            SET MESSAGE_TEXT = 'You may not insert non stable id_collection';
        END IF;
    END IF;
    RETURN 0;
 END;

//
  

#1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以获得正确的语法   'function collections_prevent_cycle()附近返回整数BEGIN   在第1行声明max_of_b'

我正在搞乱声明,但无法摆脱 - 任何人都可以帮助我PLZ?

修复了我的第一个Delimiter pbm:

1 个答案:

答案 0 :(得分:0)

最后找到了错误的解决方案。

第一:

  
      
  • 好像你不能使用NEW&amp;在MYSQL上的OLD关键字。所以我做了一个触发器。

  •   
  • 切换到Adminer而不是PHPmyAdmin使用DELIMITER我注意到DELIMITER *(空格)$$ *表示(空格)$$ 而不仅仅是 $$

  •   
  • SET:=没有工作所以我使用基本的SELECT ... INTO ... FROM

  •   
  • 创建或替换不存在 - 你必须分开操作。

  •   

这是我编写的代码,但是可以帮助你完成工作。

DELIMITER $$
DROP trigger IF EXISTS collections_prevent_cycle $$
CREATE trigger collections_prevent_cycle 
BEFORE insert ON material FOR EACH ROW BEGIN

    DECLARE max_of_id_item SMALLINT;
    DECLARE max_of_both SMALLINT;

    SELECT MAX(GREATEST(id_item, id_collection))     
    INTO max_of_both    
    FROM material;

    SELECT MAX(id_item)
    INTO max_of_id_item
    FROM material;

    IF ((SELECT id_collection 
          FROM material 
          WHERE id_collection = NEW.id_collection) = NULL) THEN
            IF (NEW.id_item > max_of_id_item) THEN             
                SIGNAL SQLSTATE '45000'
                SET MESSAGE_TEXT = 'You may not insert items that doesnt exist';

            ELSEIF (NEW.id_collection <> max_of_both + 1) THEN             
                SIGNAL SQLSTATE '45000'            
                SET MESSAGE_TEXT = 'You may not insert non stable id_collection';
            END IF;
    END IF;
END $$
DELIMITER ;

我的目标是以这种方式强行插入:

  • 如果添加了新的集合ID - 它必须是(集合和项目的最大ID)+ 1
  • 如果添加了新的集合ID - 它必须包含现有项目(id_item&lt; max(id_item))

如果有人知道为什么触发器没有触发 - 我就没气了:&#39;(。

编辑: 我测试了两个子叠加IF(IF&amp; ELSEIF)它们单独工作。

因此,它是第一个失败的IF。

我认为= NULL不够,但是在查询的可能结果的文档中找不到答案。

我这样挖 - 如果有人有一个漂亮的解决方案,我会接受它。卡伯。

编辑2:它有效!

(SELECT count(*) 
          FROM material 
          WHERE id_collection = NEW.id_collection) = 0)

代替 由

(SELECT count(*) 
          FROM material 
          WHERE id_collection = NEW.id_collection) = 0)

所以当查询为空时(而不是这个明显的空资源),查询返回0。

我赢了!