2017-01-30 16 views
1

予約したテーブルがあります。日付範囲と時間範囲が予約されています。彼らはまた、他のいくつかのモデルに属しています。私は重複する時間のために予約が発生することを不可能にする制約を追加したいと思う。PostgreSQLのwhere節に制約を追加するにはどうすればよいですか?

私はこれを持っている:

CREATE TABLE reservations (
    id integer NOT NULL,  
    dates daterange, 
    times timerange, 
    desk_id integer NOT NULL, 
    space_id integer, 
); 

ALTER TABLE reservations ADD EXCLUDE USING gist (dates WITH &&, times WITH &&) 

それはうまく動作します。しかし、私はこの制約をdesk_idとclient_idの範囲にしたいと思っています。

このレコードが異なるdesk_idまたはspace_idの場合は、時間/日付が重複するようにレコードを保存することができます。

どうすればいいですか?

答えて

2

使用していた機能と全く同じ機能を使用できますが、除外項目にdesk_idspace_idを追加することもできます。代わりに=演算子で(重複を意味する)&&演算子を使用してのこの時期、:彼らは二つの異なるdesk_idを伴うため

ALTER TABLE reservations 
    ADD EXCLUDE 
    USING gist (desk_id WITH =, space_id WITH =, dates WITH &&, times WITH &&) ; 

論文は、動作します挿入します

INSERT INTO 
    reservations 
    (id, dates, times, desk_id, space_id) 
VALUES 
    (1, '[20170101,20170101]'::daterange, '[10:00,11:00]'::timerange, 10, 10), 
    (2, '[20170101,20170101]'::daterange, '[10:30,11:00]'::timerange, 20, 10) ; 

この挿入は失敗します、ので、あなたはdesk_idspace_id時間範囲の重複を持つ、と同じことがしたい:

INSERT INTO 
    reservations 
    (id, dates, times, desk_id, space_id) 
VALUES 
    (3, '[20170101,20170101]'::daterange, '[10:00,11:00]'::timerange, 10, 10) ; 
優れた
+0

、ありがとう。私は最初に 'CREATE EXTENSION btree_gist;'を実行しなければなりませんでした。 日付と時刻を表すために2つの異なるフィールドを使用するのは、ある日付範囲の特定の時間の予約であるためです。 「月曜日から金曜日までの9時から15時まで」と考えてください。 「datetimes tsrange」が1つしかなかった場合、この時間範囲は連続したものになります。 – Nerian

+0

オクラホマ、それを得て、理にかなっている。あなたは00:00境界を越えることができないという制限があります。私は私の答えのうち、該当しない部分をクリアしました。 – joanolo

関連する問題