下面是一个模式,在这里我需要设置一个约束,使得第二个新条目可以被放入一个房间号,甚至在现有的DEBDT对于同一个房间号。你们谁能帮我做这个吗??
CREATE TABLE Accomodation (
roomNo INTEGER NOT NULL,
arrDt DATE NOT NULL,
depDt DATE NOT NULL,
PRIMARY KEY (roomNo, arrDt),
CONSTRAINT date_chk CHECK (arrDt < depDt)
);
INSERT INTO HotelStays(roomNo, arrDt, depDt) VALUES
(123, to_date('20160202', 'YYYYMMDD'),to_date('20160206','YYYYMMDD')),
(123, to_date('20160205', 'YYYYMMDD'), to_date('20160208','YYYYMMDD'));
我试过在WHERE in约束下给出一个子查询,但它在SQL Fiddle中不起作用。
最佳答案
这可以在日期范围内使用exclusion constraint来完成:
alter table Accomodation
add constraint no_overlap
exclude using gist (roomno with =, daterange(arrdt, depdt) with &&);
注意,您需要btree_gist extension来支持GiST索引中的
=
运算符。关于sql - 表级约束,以防止日期范围重叠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35521073/