フィールドをコピーするためにmysqlでトリガーをセットアップする方法
質問
私は私がまとめた社内アプリケーションを持っています、そして、私は一般的に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から名前を削除します
所属していません dba.stackexchange