0

簡単な予約テーブルがあります。

id
date_start (date)
date_end (date)

別の予約と重複する予約の挿入を禁止するトリガーを作成する正しい方法は何ですか?

基本的に、2つの予約が重複することはできません。

この問題を解決するための一般的なアプローチはありますか?

4

1 に答える 1

0

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によっては正確なクエリを変更する必要があるかもしれませんが、ロジックは同じである必要があります。一般に、トリガーから例外をスローすると、トランザクションがロールバックされ、新しい予約が許可されないことに注意してください。

于 2012-12-30T02:38:21.250 に答える