下面是一个模式,在这里我需要设置一个约束,使得第二个新条目可以被放入一个房间号,甚至在现有的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/

10-10 11:00