web-dev-qa-db-ja.com

入力を他のテーブルの値と比較するトリガーを作成するにはどうすればよいですか?

次のフィールドを持つ2つのテーブルを作成しました。

TABLE 1: "Bookings"
  FIELD: "fk_flight_number"
  FIELD: "date_of_reservation"    

TABLE 2: "Flights"
  FIELD: "flight_number"
  FIELD: "date_of_departure"

データの整合性を保つために、条件を追加します。 ON INSERTを確認したい:

1)Bookings内-fk_flight_numberFlightsに存在する必要があります

2)date_of_reservation<よりも小さい(date_of_departure)必要があります。

どうやってするか?私は似たようなことを読み、キーワードはTRIGGERでした。私の場合も同じだと思います。 2番目のテーブルの参照方法を教えていただけますか?論理的な条件は重要ではありません-私はそれを扱うことができます。必要なトリガーの作成方法がわからないため、スニペットが必要です。または、同様の問題を説明する記事を知っている場合-私もそれを感謝します。どうもありがとうございます。当然のことながら、最善のアプローチがトリガーであることは100%確実ではありません。他のアドバイスもいただければ幸いです。もう一度お願いします-ありがとう!

3
DELIMITER $$  
CREATE TRIGGER Bookings_BeforeInsert BEFORE INSERT ON Bookings
FOR EACH ROW  
BEGIN  
    DECLARE found_flight,dummy,baddata INT;
    DECLARE dt DATETIME;
    SET baddata = 1;
    SELECT COUNT(1) INTO found_flight FROM Flights
    WHERE flight_number = NEW.fk_flight_number;
    IF found_flight > 0 THEN
        SELECT date_of_departure INTO dt FROM Flights
        WHERE flight_number = NEW.fk_flight_number;
        IF date_of_reservation < date_of_departure THEN
            SET baddata = 0;
        END IF;
    END IF;
    IF baddata = 1 THEN  
        SELECT CONCAT('Cannot Insert This Because Age ',NEW.age,' is Invalid')  
        INTO dummy FROM information_schema.tables;
    END IF;  
END; $$  
DELIMITER ;

IFステートメントIF baddata = 1 THEN意図的に偽のメッセージが作成されました。これは、ストアドプロシージャのMySQLエラー処理が適切に設計されていないためです。私が本のページ254〜256から得たこのクレイジーな回避策 MySQLストアドプロシージャプログラミング

enter image description here

小見出し「トリガーによるデータの検証」の下:

私は過去の投稿でこのスタイルのトリガープログラミングについて書きました

1
RolandoMySQLDBA

SQL Serverの回答

CREATE TRIGGER FightNumberExists ON dbo.Bookings
AFTER INSERT
AS
IF EXISTS (SELECT fk_flight_number
           FROM inserted i
           INNER JOIN Flights f 
              ON f.flight_number = i.fk_flight_number
           WHERE i.date_of_reservation < f.date_of_departure   
      )
BEGIN
    RAISERROR ('Flight Number does not exist', 16, 1);
    ROLLBACK TRANSACTION;

    RETURN 
END;

GO

Notes SQL Serverでは、値は最初に「挿入」または「削除」テーブルにロードされてから、物理テーブルに書き込まれます。

これは、テーブルに制約を追加することでも実現できます。

1
Craig Nicholson