【问题标题】:PhpMyAdmin - err 1064 - set variable in functionPhpMyAdmin - err 1064 - 在函数中设置变量
【发布时间】:2015-07-13 14:48:05
【问题描述】:

我在使用 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() RETURN integer BEGIN 在第 1 行声明 max_of_b'

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

用 :

修复了我的第一个分隔符 pbm

【问题讨论】:

  • 已安装的管理员 - 似乎既是 DELIMITER 又是声明 pbm :(

标签: phpmyadmin mysql-error-1064


【解决方案1】:

终于找到了错误的解决办法。

第一:

  • 您似乎不能在 MYSQL 的函数中使用 NEW 和 OLD 关键字。所以我做了一个触发器。

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

  • SET := 不起作用,所以我使用基本的 SELECT ... INTO... FROM

  • CREATE 或 Replace 不存在 - 您必须分开操作。

这是我编写的代码,可以编译但不起作用。

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

如果有人知道为什么触发器不触发 - 我没油了 :'(.

编辑: 我测试了两个 subbricated IF (IF & 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(而不是这个明显的空资源)。

我赢了!

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 2015-04-20
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多