フィールドをコピーするためにmysqlでトリガーをセットアップする方法

dba.stackexchange https://dba.stackexchange.com/questions/9678

  •  16-10-2019
  •  | 
  •  

質問

私は私がまとめた社内アプリケーションを持っています、そして、私は一般的にSQLを非常に初めてにしています。

私たちのデータのほとんどを含むテーブルがあります。このように見えるふりをしましょう。

Matrix

|Name       | Description        |
----------------------------------
|Server01   | First Server       | 

今、私は別のテーブルを追加しました、そして、それがこのように見えるふりをしましょう。

OtherInfo
|Name       | Price              |
----------------------------------
|Server01   | 100                |

MatrixからotherInfoへのデータの最初のコピーを作成しました。人々はマトリックスにエントリを追加します。マトリックスの名前を他のINFOテーブルに入れることを望みます。

基本的に、名前フィールドは常にマトリックスにあるものを複製する必要があります。マトリックスで何かが変更または削除された場合、同じことがotherinfoで発生するはずです。

これをセットアップするにはどうすればよいですか?

役に立ちましたか?

解決

マトリックステーブルに次の4つのトリガーを作成する

DELIMITER $$   
CREATE TRIGGER matrix_ai AFTER INSERT ON Matrix FOR EACH ROW   
BEGIN   
    INSERT IGNORE INTO OtherInfo (Name) VALUES (NEW.Name);
END; $$   
CREATE TRIGGER matrix_bu BEFORE UPDATE ON Matrix FOR EACH ROW   
BEGIN
    DECLARE found_key,dummy INT;
    SELECT COUNT(1) INTO found_key FROM Matrix WHERE Name = NEW.Name;
    IF found_key = 1 THEN
        -- Abandon the Trigger of Name already exists
        SELECT data_length INTO dummy FROM information_schema.tables;
    END IF;
END; $$   
CREATE TRIGGER matrix_au AFTER UPDATE ON Matrix FOR EACH ROW   
BEGIN
    UPDATE OtherInfo SET Name=NEW.Name WHERE Name=OLD.Name;
END; $$   
CREATE TRIGGER matrix_ad AFTER DELETE ON Matrix FOR EACH ROW   
BEGIN   
    DELETE FROM OtherInfo WHERE Name=OLD.Name;
END; $$   
DELIMITER ;

各トリガーは何をしますか?

  • matrix_ai 新しい名前をに挿入します OtherInfo に挿入された後 Matrix
  • matrix_bu 検証を実行して、古い名前をマトリックステーブルに既に存在する新しい名前に変更しないようにします
  • matrix_au Matrixで更新した新しい名前にotherinfoの古い名前を更新します
  • matrix_ad Matrixから削除したばかりのotherinfoから名前を削除します
ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top