トリガーについて
このジャンルでお願いします。
次のようなテーブルで
DROP TABLE IF EXISTS item;
CREATE TABLE IF NOT EXISTS item (
id int(11) NOT NULL AUTO_INCREMENT,
parent_id INT,
name varchar(32) NOT NULL,
level int NOT NULL,
FOREIGN KEY (parent_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO item (parent_id, name) VALUES (null, 'item1');
INSERT INTO item (parent_id, name) VALUES (1, 'item2');
INSERT INTO item (parent_id, name) VALUES (2, 'item3');
INSERT INTO item (parent_id, name) VALUES (3, 'item4');
INSERT INTO item (parent_id, name) VALUES (2, 'item5');
INSERT INTO item (parent_id, name) VALUES (null, 'item6');
INSERT INTO item (parent_id, name) VALUES (6, 'item7');
INSERT INTO item (parent_id, name) VALUES (null, 'item8');
DROP PROCEDURE IF EXISTS UPDATE_LEVEL;
DELIMITER //
CREATE PROCEDURE UPDATE_LEVEL()
BEGIN
DECLARE CNT INT;
DECLARE LVL INT;
SET LVL=1;
UPDATE item SET level=0;
UPDATE item
SET level=LVL
WHERE parent_id IS NULL;
SELECT COUNT(*) INTO CNT FROM item WHERE level=LVL;
WHILE CNT>0 DO
UPDATE item
INNER JOIN (SELECT id FROM item WHERE level=LVL) as temp ON parent_id=temp.id
SET item.level=LVL+1;
SET LVL=LVL+1;
SELECT COUNT(*) INTO CNT FROM item WHERE level=LVL;
END WHILE;
END
//
DELIMITER ;
DROP TRIGGER IF EXISTS TRG_INSERT_ITEM;
DELIMITER //
CREATE TRIGGER TRG_INSERT_ITEM AFTER INSERT ON item
FOR EACH ROW BEGIN
CALL UPDATE_LEVEL();
END;
//
DELIMITER ;
itemテーブルにinsertした場合にトリガーでUPDATE_LEVEL()を実行するようにしているのですが、
実際に挿入すると、
>Can't update table 'item' in stored function/trigger because it is already used by statment which invoked this stored function/trigger .
このようなエラーが出てしまいます・・・
UPDATE_LEVEL()にinsertらしき記述はないと思うのですが、
これはなぜこのようなエラーが出るのでしょうか?
お礼
回答ありがとうございました。 INSERT文、早速試してみます♪ 条件の方に関しては、Symfoの制約上、副問合せの指定が出来ないようなんです。 Symfoでは厳しいのかな…