2015-05-04 22 views
-1

我在使用PhpMyAdmin時遇到困難。 我的表是:PhpMyAdmin - err 1064 - 在函數中設置變量

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服務器版本的使用權語法手冊 附近「功能collections_prevent_cycle()返回整數BEGIN DECLARE max_of_b」在行1

我與申報搞亂,但不能得到擺脫 - 任何人都可以幫助我嗎?

固定我定界符第一PBM有:

+0

安裝的Adminer - 似乎是DELIMITER&declare pbm :( – Falt4rm

回答

0

終於找到了解決的錯誤。

第一:

  • 似乎在功能上的MYSQL你無法使用新& OLD關鍵字。所以我做了一個觸發器。

  • 切換到Adminer而不是phpMyAdmin來使用DELIMITER我注意到符*(空間)$$ *表示(空間)$$不僅$$

  • SET:=沒有因此我使用基本的SELECT ... INTO ...從

  • 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添加 - 它必須是(包括集合&項目的最大編號)+ 1
  • 如果新的集合ID添加 - 它必須包含現有項目(id_item < MAX(id_item))

如果任何人有一個想法,爲什麼觸發器不會觸發 - 我出去Ø f氣:'(。

編輯: 我測試了兩個sub sublayed IF(IF & ELSEIF)他們單獨工作。

因此,它是第一個如果失敗。

我想= 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時,它是空的(而不是這種明顯的空ressources)。

我贏了!