1

私は単純なテーブルを持っています:

CREATE  TABLE `accounting`.`People` (
  `ID` INT NOT NULL AUTO_INCREMENT ,
  `Name` VARCHAR(45) NULL ,
  `Property_number` VARCHAR(45) NULL ,
  `People_at_Location` INT NULL ,
  PRIMARY KEY (`ID`) );

INSERT INTO `accounting`.`People` (`Name`, `Property_number`, `People_at_Location`) VALUES ('Jim', '13', '2');
INSERT INTO `accounting`.`People` (`Name`, `Property_number`) VALUES ('Tony', '16');
INSERT INTO `accounting`.`People` (`Name`, `Property_number`) VALUES ('Alice', '9');
INSERT INTO `accounting`.`People` (`Name`, `Property_number`, `People_at_Location`) VALUES ('Martha', '13', '2');
INSERT INTO `accounting`.`People` (`Name`, `Property_number`) VALUES ('Vandy', '');

私たちのデータでは、すべての行/レコードの名前を知っています。しかし、開始時には Property_number がありませんでした。クライアントからメールが返ってきたら、Property_number を取得し、レコードを更新します。

本当に必要なのは、Property_number を調べてクエリを実行し、データベース内に同じプロパティ番号を持つ他のレコードがいくつあるかを確認し、その Property_number に追加の人物がいることがわかったときにすべてのレコードを更新するトリガーです。

たとえば (上記のサンプル データを考えると)、次のようになります。

ID     Name     Property_number     People_at_location
1      Jim      13                  2
2      Tony     16                  Null
3      Alice    9                   1
4      Martha   13                  2
5      Vandy    Null                Null      

そのため、Vandy から、property_number 13 にいることを示す新しい情報を取得します。更新された People_at_location カウントを反映するために、レコード 1、4、および 5 を更新します。

ID     Name     Property_number     People_at_location
1      Jim      13                  3
2      Tony     16                  Null
3      Alice    9                   1
4      Martha   13                  3
5      Vandy    13                  3      

このトリガーはどのように見えますか?

4

1 に答える 1

2

一般的な形式は次のようになります (メモリから実行されるため、いくつかの構文ミスがある可能性があります)。

CREATE TRIGGER update_people_at_location
    AFTER UPDATE ON People FOR EACH ROW
    BEGIN 
        // make sure we updated the property number from a NULL value to a non null
        // depending on your exact use case you may or may not want that check
        IF (OLD.Property_number IS NULL AND NEW.Property_number IS NOT NULL) THEN
           -- store the count for this property_number
           -- we are in an AFTER UPDATE trigger so the update is already done,
           --   which means this count will include the newly set value
           DECLARE total_people_at_location int;
           SELECT COUNT(*) INTO total_people_at_location FROM People WHERE Property_number = NEW.Propery_number;
           -- update the rows with the proper count
           UPDATE People SET People_at_location = total_people_at_location WHERE Property_number = NEW.Propery_number;
        END IF;
    END 

これは、現在のカウントがNULL(あなたの例では ID 2 のように) であるレコードでもうまく動作するはずですが、これらのレコードは現在のデータの状態では明らかに間違っています (あなたが non を持っている理由はわかりませんNULL Property_numberNULL People_at_location、それは何もしません検出);

おそらく、新しいレコードの挿入で同じ計算を行いたいと思います。その場合、ロジックをストアド プロシージャに抽出し、コードを複製する代わりにトリガー中にそのプロシージャを呼び出す必要があります。

于 2013-06-17T21:16:54.637 に答える