3

たとえば、「A_」などの特定の文字列で始まるテーブルで、特定の条件 AFTER a UPDATE で起動するトリガーを作成しようとしています。

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
;

トリガーは、更新された行のインデックスまでの SUM (列 "A") から SUM (列 "B") を引いて、この SUM をこの行の列 "C" に書き込む必要があります。

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 サーバーのバージョンに対応するマニュアルを確認してください。2行目のEND'

手伝ってくれませんか?

4

2 に答える 2

1

さて、テーブルを選択してトリガーを実行できると思います。

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

編集:

テストされていませんが、これも機能する可能性があります (そうでない場合は、前のクエリでテーブル名を選択し、前に述べたように各トリガーを作成するだけです)。

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>データベース名を必ず置き換えてください。

于 2016-08-02T17:46:08.960 に答える
0

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

ドキュメント: CREATE TRIGGER 構文

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

于 2016-07-24T18:57:44.770 に答える