2017-01-08 19 views
0

私は本当にSQLに問題はありますが、データベースを保持しようとしています可能な限りシンプルで最小限のものにする。値を複製せず、代わりに参照とIDを使用する。今#1442 - ストアドファンクション/トリガでテーブル '*'を更新できません。このストアドファンクション/トリガを起動したステートメントで既に使用されています。

クエリを挿入した後、私はエラー

1442を取得する - それは、すでに文で使用されているため、テーブルを更新することはできませんが、この保存された機能/トリガ

を呼び出したストアド・ファンクション/トリガに「署名しました」

トリガーが無効のときにクエリを挿入できます。しかし、私のクエリはテーブル 'users'からのみ読み込みを行うので、競合は起こらないはずです。私はデッドロックについて何かを読んでいます - クエリはそれを使用している間などのテーブルをロックしているため、トリガは行を更新できません。どのように私はこれを達成することができますアイデア?

私はクエリを簡略化し、重要なことだけが存在するようにしました。

問合せ:

INSERT INTO signed (time_of_start, player) 
    SELECT time_of_game_id, users.user_id 
    FROM time_of_game, users 
    WHERE time_of_game.time_of_start = "2017-02-01 12:00:00" 
     AND users.steamid = "123456789"; 

トリガー:それはすでにこのトリガーを起動しますINSERT INTO.. SELECTクエリによって読まれているため

CREATE TRIGGER `payment_for_joining` 
AFTER INSERT ON `signed` 
FOR EACH ROW 
    UPDATE users 
    SET users.credit = users.credit-1 
    WHERE users.user_id = NEW.player 

答えて

0

それはあなたがテーブルを更新することはできません。

別の方法は、例えば、トリガーを無効にして、個別のユーザーテーブルを更新することです。:

INSERT INTO signed (time_of_start, player) 
SELECT time_of_game_id, users.user_id FROM time_of_game, users 
WHERE time_of_game.time_of_start="2017-02-01 12:00:00" 
AND users.steamid="123456789"; 

UPDATE users join time_of_game SET users.credit = users.credit-1 
where time_of_game.time_of_start="2017-02-01 12:00:00" 
AND users.steamid="123456789"; 

これら2つのテーブルをリンクし、任意の列がある場合は、ON句で結合列を追加することができます。

+0

私はちょうど1つのリクエスト/クエリでこの2つの操作を実行できることを期待していました。しかし、私は経験豊富なプログラマーからのヒントを取るつもりです、私はあなたのソリューションを使用:)ありがとう – Vergil333

関連する問題