Hatena::Grouppostgresql

PostgreSQL 雑記 このページをアンテナに追加 RSSフィード

2011-11-15PG9.2 範囲型 このエントリーを含むブックマーク このエントリーのブックマークコメント

PostgreSQL 9.2 で「範囲型 (Range Types)」が採用されます。範囲型は、{ 下限, 上限 } をペアで扱うデータ型で、数直線上の「範囲」を表現することができます。また、配列と同様、要素として各種スカラー型を選べます。整数の範囲、数値の範囲、日時の範囲など、用途にあわせて型を選択できます。

9.0 で追加された「排他制約」は、これまでは主に地理データ (box, circle 等) の重なりのチェックに使えましたが、9.2 では「数値や時間の幅」を保証することもできるようになります。用途としては、「有効期限開始 / 終了」を持っているようなデータは結構多いような気がしますし、用途も広がったのではないでしょうか。

以下、範囲型、範囲型関数、排他制約を使った簡単な例です。[1] と [2] は、同じ部屋で予約時間帯が重なっているのでエラーになりますが、[1] と [3] は部屋が異なるので問題ないことがわかります。

=# CREATE EXTENSION btree_gist;
=# CREATE TABLE reservation (
     room   text,
     during tsrange, -- range of timestamp
     EXCLUDE USING gist (room WITH =, during WITH &&)
   );
=# INSERT INTO reservation VALUES ('123A', '[2010-01-01 14:00, 2010-01-01 15:00)'); -- [1]
=# INSERT INTO reservation VALUES ('123A', '[2010-01-01 14:30, 2010-01-01 15:30)'); -- [2]
ERROR:  conflicting key value violates exclusion constraint "reservation_room_during_excl"
=# INSERT INTO reservation VALUES ('123B', '[2010-01-01 14:30, 2010-01-01 15:30)'); -- [3]
-- lower/upperで下限/上限を取り出し
=# SELECT room, lower(during), upper(during) FROM reservation;
 room |        lower        |        upper
------+---------------------+---------------------
 123A | 2010-01-01 14:00:00 | 2010-01-01 15:00:00
 123B | 2010-01-01 14:30:00 | 2010-01-01 15:30:00
(2 rows)