簡単な予約テーブルがあります。
id
date_start (date)
date_end (date)
別の予約と重複する予約の挿入を禁止するトリガーを作成する正しい方法は何ですか?
基本的に、2つの予約が重複することはできません。
この問題を解決するための一般的なアプローチはありますか?
ON INSERT OR UPDATE
次の条件が真の場合に例外をスローするトリガーを記述します。
EXISTS
(
SELECT 1
FROM bookings
WHERE date_start <= NEW.date_end
AND date_end >= NEW.date_start
AND (INSERTING OR id <> NEW.id)
)
条件は、新しいレコードとのdate_start <= NEW.date_end AND date_end >= NEW.date_start
既存のオーバーラップと一致します。UPDATEのINSERTING OR id <> NEW.id
場合、条件は現在のレコードを除外します(そうでない場合は、常にそれ自体とオーバーラップします)。
必要に応じて、最後の条件を削除し、2つの別々のトリガーを使用できることに注意してください。1つはINSERT用、もう1つはUPDATE用です。
RDBMSによっては正確なクエリを変更する必要があるかもしれませんが、ロジックは同じである必要があります。一般に、トリガーから例外をスローすると、トランザクションがロールバックされ、新しい予約が許可されないことに注意してください。