このジャンルでお願いします。
次のようなテーブルで
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らしき記述はないと思うのですが、
これはなぜこのようなエラーが出るのでしょうか?
No.1
- 回答日時:
外部キー制約とインサートのトリガーが競合していますね
外部キー制約はどうしてもいりますか?
ご回答有難うございます。
外部キー制約を次のように
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,
PRIMARY KEY(id)
) DEFAULT CHARSET=utf8;
外して試してみたのですが全く同じようなエラーでした・・・
外部キーって当然itemテーブルでのことですよね?
一応、自分としては外部キー制約があればもし削除した場合に
それに関連する行もついでに削除してくれるし、
あとphpmyadminなどを利用して閲覧するときにリンクが貼ってあってそのカラムを辿れるのが便利だなと思って
なんとなく使用しています。
そこら辺も含めて一般的に外部キー制約に対するyambejpさんのお考えがあれば
アドバイス頂けないでしょうか?
No.2ベストアンサー
- 回答日時:
あ、ごめんなさい
itemテーブルにデータをつっこんだときに
itemテーブル自信をアップデートするということですか?
http://dev.mysql.com/doc/refman/5.1/ja/routine-r …
その関数やトリガを実行したステートメントが ( 読み取り、または書込みに )
すでに使用しているテーブルを改変することはできない
・・・という制限があります
ご回答有難うございます。
なるほど、たしかにそうですね。
ではitemテーブルにデータを挿入した場合は次に
CALL UPDATE_LEVEL();
を呼び出す方法でしか更新する方法ないということなのでしょうか?
なにかこのテーブルに関しても自動的(トリガ的な感じで)に更新するやり方があれば良いのですが。。
No.3
- 回答日時:
無限ループ処理になりそうなので無理だと思います
たしょうタイムラグはでますが
スケジュール管理用のテーブルをひとつ用意して、
コールしたいイベントが発生したときに管理テーブルのフラグをたて
イベントスケジューラでフラグが立っていたらcallしてフラグを消す
・・・的な処理を5分ごとに実行すればある程度目的は達成できるかと
どうしても即座に反映したければ、アプリケーション側でCALLする方が
確実ですが。
ご回答有難うございます。
なるほど、たしかにそのやり方だと大変そうですね。。
自分もアプリケーション側で呼び出すしかないのかなぁとは思っています。
とりあえず参考になりました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php エラー 2 2022/10/23 16:43
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- MySQL mysqlで INSERT と SELECTの用途は 1 2022/04/01 00:45
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- Ruby No route matches [GET] "/posts/5/destroy" 1 2022/03/24 13:00
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQLサーバから、項目の属性(型...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
[MySQL] UNIQUE制約の値を更新...
-
select文のwhere句に配列を入れ...
-
SQLにて特定の文字を除いた検索...
-
selectした大量データをinsert...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
MySQLのint型で001と表示する方...
-
VIEWの元のテーブルのindexって...
-
複数テーブルのGROUP BY の使い...
-
Unionした最後にGROUP BYを追加...
-
Access パラメータクエリをcsv...
-
LAST_INSERT_IDで同時にアクセ...
-
PL/SQLの変数について
-
[SQLServer] テーブル名からカ...
-
VMwareがCDドライブを認識する...
-
1対多結合で多を絞り込み条件と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報