PhpMyAdmin - 错误 1064 - 在函数中设置变量
PhpMyAdmin - err 1064 - set variable in function
我在使用 PhpMyAdmin 时遇到了困难。
我的 table 是:
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 - 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 'function collections_prevent_cycle() RETURN integer BEGIN
DECLARE max_of_b' at line 1
我正在弄乱声明但无法摆脱 - 任何人都可以帮助我吗?
修复了我的第一个定界符 pbm:
- Delimiter in PhpMyadmin
终于找到了错误的解决方法。
第一个:
It seems u can't use NEW & OLD keywords in function on MYSQL. So i made a Trigger instead.
Switched to Adminer instead of PHPmyAdmin to use DELIMITER I notice DELIMITER*(space)$$* means (space)$$ and not only $$
SET := didn't work so I use basic SELECT ... INTO... FROM
CREATE or Replace doesn't existe - u have to separate operations.
这是我编译但无法运行的代码。
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 ;
我的目标是以这种方式强制插入:
- 如果添加新的 collection id - 它必须是(collection 和项目的最大 id)+ 1
- 如果添加新的 collection id - 它必须包含现有项目 (id_item < max(id_item))
如果有人知道为什么触发器不触发 - 我没油了:'(.
编辑:
我测试了两个子嵌套 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)
所以当它为空时查询 returns 0(而不是这个明显的空资源)。
我赢了!
我在使用 PhpMyAdmin 时遇到了困难。 我的 table 是:
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 - 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 'function collections_prevent_cycle() RETURN integer BEGIN DECLARE max_of_b' at line 1
我正在弄乱声明但无法摆脱 - 任何人都可以帮助我吗?
修复了我的第一个定界符 pbm:
- Delimiter in PhpMyadmin
终于找到了错误的解决方法。
第一个:
It seems u can't use NEW & OLD keywords in function on MYSQL. So i made a Trigger instead.
Switched to Adminer instead of PHPmyAdmin to use DELIMITER I notice DELIMITER*(space)$$* means (space)$$ and not only $$
SET := didn't work so I use basic SELECT ... INTO... FROM
CREATE or Replace doesn't existe - u have to separate operations.
这是我编译但无法运行的代码。
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 ;
我的目标是以这种方式强制插入:
- 如果添加新的 collection id - 它必须是(collection 和项目的最大 id)+ 1
- 如果添加新的 collection id - 它必须包含现有项目 (id_item < max(id_item))
如果有人知道为什么触发器不触发 - 我没油了:'(.
编辑: 我测试了两个子嵌套 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)
所以当它为空时查询 returns 0(而不是这个明显的空资源)。
我赢了!