2

MySQL 5.5 を使用しています。mysql トリガー構文を使用してテーブルにトリガーを追加する必要があります: http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

彼らが与えた例は、私がこれを行う方法を説明していません-

私はテーブルを持っています - table(a INT, b INT, c INT);。fieldabは数値ですが、 fieldca+である必要がありますb。今、あなたはなぜこれをビューに平手打ちしてそれを終わらせないのか、あるいはなぜこれを私のコードに入れないのか疑問に思っていると思います. その理由は、バリエーションが必要な場合に値を変更できる、自動計算フィールドの利便性を必要とするクライアントと協力しているためです。彼らは監査会社であり、会社が監査日を逃したなどの理由で、数値のマッサージが必要になることがよくあります。

では、次のようなトリガーを作成するにはどうすればよいですか。

on insert:
make `c` the value of `a` + `b`.

on update: 
if the value of NEW.`c`==OLD.`c` THEN
make `c` the value of `a` + `b`.
ELSE 
no change

新しい値が古い値と異なる場合に更新が変更されない理由は、実際の合計とは少し異なるように数値を変更する必要があるためです。

私のロジックを自由に変更してください。私の目的は、c手動で入力された場合は値を保持し、手動で触れられていない場合は爆破することです。

ありがとう!

4

1 に答える 1

2

これは古い質問であることは承知していますが、まだ答えが必要な場合はここにあります。

まず、より直接的な更新を行うために、テーブルに id 列が追加されています。

CREATE TABLE table1
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  a INT, b INT, c INT
);

現在、INSERTトリガーでは、事前に計算された値をC列に挿入できるようにロジックが変更されています。

CREATE TRIGGER tg_table1_before_insert
BEFORE INSERT ON table1
FOR EACH ROW
  SET NEW.c = IF(NEW.c IS NULL, NEW.a + NEW.b, NEW.c);

更新トリガーは、要件ごとにロジックを実装します

CREATE TRIGGER tg_table1_before_update
BEFORE UPDATE ON table1
FOR EACH ROW
  SET NEW.c = IF(NEW.c <=> OLD.c, NEW.a + NEW.b, NEW.c);

次に、いくつかの挿入と更新を行います

INSERT INTO table1 (a, b) VALUES (1, 2), (3, 4);
INSERT INTO table1 (a, b, c) VALUES (5, 6, 0), (7, 8, 100);
UPDATE table1 SET c = 25 WHERE id = 2;
UPDATE table1 SET c = c  WHERE id = 3;

その結果、

| | ID | あ | ビ | シー |
--------------------
| | 1 | 1 | 2 | 3 | -- 挿入時に計算
| | 2 | 3 | 4 | 25 | -- 更新時に明示的に設定
| | 3 | 5 | 6 | 11 | -- 更新時に再計算
| | 4 | 7 | 8 | 100 | -- 挿入時に明示的に設定

これがSQLFiddleのデモです

于 2013-08-02T04:50:30.437 に答える