如何防止在oracle sql中双重预订?

时间:2017-12-13 15:41:25

标签: sql oracle

我试图建立一个让客户预订飞机的数据库,客户可以为不同的飞机进行多次预订, 但是只有一个客户可以一次预订一架飞机。

例如:客户可以预订Aircraft_1D - > 12但是如果另一个客户来自同一个出发地或到达日期,则该客户不应该预订同一架飞机。

我甚至不确定从哪里开始,我应该创建检查约束还是触发器?

这是我的预订表代码;

CREATE TABLE Booking (
Booking_ID            NUMBER(10)   NOT NULL PRIMARY KEY,
Company_ID            NUMBER(10)   NOT NULL REFERENCES 
Penrhyn_Jet_Charter(Company_ID),
Customer_ID           NUMBER(10)   NOT NULL REFERENCES 
Customer(Customer_ID),
Aircraft_ID           NUMBER(10)   NOT NULL REFERENCES 
Aircraft(Aircraft_ID),
Assignment_No         NUMBER(10)   NOT NULL,
Booking_Date          DATE         DEFAULT SYSDATE,
Charter_Cost          NUMBER(14,2) CHECK(Charter_Cost > 0),
Departure_Date        DATE         NOT NULL,
Departure_Location    CHAR(3)      NOT NULL,
Arrival_Date          DATE         NOT NULL,
Arrival_Destination   CHAR(3)      NOT NULL
);

任何想法或线索? 谢谢!

2 个答案:

答案 0 :(得分:1)

UNIQUE KEYAircraft_ID,Departure_Date

的组合可能有2 Aircraft_ID,Arrival_Date个约束
ALTER TABLE Booking 
ADD CONSTRAINT booking_unq1 UNIQUE (Aircraft_ID,Departure_Date);

ALTER TABLE Booking 
ADD CONSTRAINT booking_unq2 UNIQUE (Aircraft_ID,Arrival_Date);

答案 1 :(得分:1)

问题是你想在aircraft_id + date上有一个唯一约束,但是有两个日期:Departure_Date和Arrival_Date。解决这个问题的另一种方法是持有航班的第二张表:

create table flight 
(
  aircraft_id  number(10),
  flight_date  date,
  constraint pk_flight primary key (aircraft_id, flight_date)
);

该表的主键禁止在同一天使用同一架飞机进行两次飞行。

现在在预订时写一个插入触发器,写入两个条目,一个用于出发日期,一个用于到达日期,写入航班表。当您插入重复航班时,无论是出发还是到达,都会导致异常。