2016-07-24 1 views
3

特定の条件の条件下で起動するトリガーを作成しようとしています 更新後、 A_ "とする。"Table_"で始まる表の更新後に起動するトリガーを作成する方法

CREATE TABLE `Table_TEST` (
    `id` INT(11) NULL DEFAULT NULL, 
    `A` INT(11) NULL DEFAULT NULL, 
    `B` INT(11) NULL DEFAULT NULL, 
    `C` INT(11) NULL DEFAULT NULL 
) 
COLLATE='utf8_unicode_ci' 
ENGINE=InnoDB 
; 

トリガーが更新され、この行の列「C」にこの合計を書いた行のインデックスまでのSUM(列「A」)マイナスSUM(列「B」)を作るべきです。

CREATE DEFINER=`root`@`localhost` 
TRIGGER `Table_TEST_before_insert` BEFORE UPDATE ON `Table_TEST` FOR EACH ROW 
BEGIN 
SET new.C = (SUM(new.A)-SUM(new.B)); 
END 

このトリガーはこの後

UPDATE `Testdb`.`Table_TEST` SET `b`='4' WHERE `id`=1 LIMIT 1; 
/* SQL Fehler (1111): Invalid use of group function */ 

を仕事とこの障害をもたらしていない、それはそれに与えられた式を上に応じて、そのインデックス後に来るの列「C」内の他のすべての値を更新する必要がありますそれぞれのインデックス。

今、私はPHPの関数を書いて、データベースの各更新後にPHPスクリプトに追加します。しかし、実際には私が欲しいものではありません。

私はこれをルーチン/トリガーにします。

私が試したことは、このように見えますが、そのは

CREATE DEFINER=`root`@`localhost` 
TRIGGER `TABLE_1_before_update` BEFORE UPDATE ON `TABLE_1` FOR EACH ROW 
BEGIN 
SET new.C = (SUM(new.A)-SUM(new.B)) WHERE id=NEW.id; 
END 

を働いていない私が手に障害があることに注意してください: SQL Fehler(1064):あなたは、あなたのSQL構文でエラーが発生しています。正しい構文がWHERE id = NEW.idの近くで使用するようにMySQLサーバのバージョンに対応するマニュアルを確認してください。 END '2行目

お手伝いできますか?

答えて

1

まあ、テーブルを選択してトリガーをすることができると思います。

SELECT `TABLE_NAME` 
    FROM information_schema.tables 
WHERE table_schema='<your-database-name>' 
    AND `TABLE_NAME` LIKE 'a%' 

EDIT:(、ちょうど前のクエリでテーブル名を選択して、私が前に言ったように、各トリガを作成していない場合)

がテストされていないが、これはまた仕事ができます。

CREATE 
DEFINER=`user`@`localhost` 
TRIGGER `trigger_name` AFTER UPDATE 
ON (
    SELECT `TABLE_NAME` 
     FROM information_schema.tables 
    WHERE table_schema='<your-database-name>' 
     AND `TABLE_NAME` LIKE 'a%' 
) FOR EACH ROW 

BEGIN 
    SET new.C = (SUM(new.A)-SUM(new.B)) WHERE id=NEW.id; 
END 

注:データベース名の<your-database-name>を交換することを確認します。

+0

SQLエラー1362:NEW行の更新は、トリガー後に実行されません –

+0

その後、私はそれをBEFORE UPDATEに変更しました。:SQL Fehler(1064):SQL構文にエラーがあります。正しい構文がWHERE id = NEW.idの近くで使用するようにMySQLサーバのバージョンに対応するマニュアルを確認してください。 END 'at line 2 */ –

+1

まあ... AFTER UPDATEについてはわかりませんでしたが(私が投稿したときに言ったように)、BEFORE UPDATEは機能するはずです。エラーメッセージに表示されているとおり、追加した部分の構文エラーです。私(そして他の人)がそれをチェックして助けてくれるようにするには、構文をチェックしてください。 –

0

トリガーは特定のテーブルに属します。 監視する各テーブルに手動でトリガを追加する必要があります(それぞれのテーブルの名前が「A」で始まる場合)。

ドキュメント:CREATE TRIGGER Syntax

あなたの要件は、私には奇妙に思えます。名前がフィルタと一致するテーブルのデータのみを更新するのは、まれです。データベース構造を再編成できず、すべての "A *"テーブルのデータを1つのテーブルにマージしてもよろしいですか?

+0

ありがとうございます。私がこれを選んだのはパフォーマンス上の理由があります。さて、私はそれを持って、その後、質問の第二部分について話すことができます。 –

関連する問題