官术网_书友最值得收藏!

Taking advantage of exclusion operators

So far, indexes have been used to speed things up and to ensure uniqueness. However, a couple of years ago, somebody came up with the idea of using indexes for even more. As you have seen in this chapter, GiST supports operations such as intersects, overlaps, contains, and a lot more. So, why not use those operations to manage data integrity?

Here is an example:

test=# CREATE EXTENSION btree_gist;
test=# CREATE TABLE t_reservation (
room int,
from_to tsrange,
EXCLUDE USING GiST (room with =,
from_to with &&)
);
CREATE TABLE

The EXCLUDE USING GiST clause defines additional constraints. If you are selling rooms, you might want to allow different rooms to be booked at the same time. However, you don't want to sell the same room twice during the same period. What the EXCLUDE clause says in my example is this, if a room is booked twice at the same time, an error should pop up (the data in from_to with must not overlap (&&) if it is related to the same room).

The following two rows will not violate constraints:

test=# INSERT INTO t_reservation 
VALUES (10, '["2017-01-01", "2017-03-03"]');

INSERT 0 1
test=# INSERT INTO t_reservation
VALUES (13, '["2017-01-01", "2017-03-03"]'); INSERT 0 1

However, the next INSERT will cause a violation because the data overlaps:

test=# INSERT INTO t_reservation 
VALUES (13, '["2017-02-02", "2017-08-14"]');

ERROR: conflicting key value violates exclusion constraint "t_reservation_room_from_to_excl" DETAIL: Key (room, from_to)=(13, ["2017-02-02 00:00:00","2017-08-14 00:00:00"]) conflicts with existing key (room, from_to)=(13, ["2017-01-01 00:00:00","2017-03-03 00:00:00"]).

The use of exclusion operators is very useful and can provide you with highly advanced means to handle integrity.

主站蜘蛛池模板: 宝坻区| 饶河县| 左权县| 周至县| 黄浦区| 龙门县| 衡东县| 黄梅县| 邵东县| 峡江县| 山丹县| 华蓥市| 廊坊市| 宜君县| 建始县| 南投市| 蕲春县| 子洲县| 封开县| 屏东市| 巴东县| 德钦县| 资溪县| 沙雅县| 含山县| 余江县| 桃园市| 伊金霍洛旗| 当雄县| 阿勒泰市| 盐城市| 屏山县| 永登县| 合川市| 林甸县| 张家口市| 滨海县| 全南县| 东乌珠穆沁旗| 保山市| 阳谷县|