次のフィールドを持つ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_number
はFlights
に存在する必要があります
2)date_of_reservation
は<
よりも小さい(date_of_departure
)必要があります。
どうやってするか?私は似たようなことを読み、キーワードはTRIGGERでした。私の場合も同じだと思います。 2番目のテーブルの参照方法を教えていただけますか?論理的な条件は重要ではありません-私はそれを扱うことができます。必要なトリガーの作成方法がわからないため、スニペットが必要です。または、同様の問題を説明する記事を知っている場合-私もそれを感謝します。どうもありがとうございます。当然のことながら、最善のアプローチがトリガーであることは100%確実ではありません。他のアドバイスもいただければ幸いです。もう一度お願いします-ありがとう!
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ストアドプロシージャプログラミング
小見出し「トリガーによるデータの検証」の下:
私は過去の投稿でこのスタイルのトリガープログラミングについて書きました
Apr 25, 2011
: MySQLでトリガーして挿入を防止Dec 23, 2011
: チェック制約が機能しない?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では、値は最初に「挿入」または「削除」テーブルにロードされてから、物理テーブルに書き込まれます。
これは、テーブルに制約を追加することでも実現できます。