基于2+表的ORACLE约束

时间:2013-04-01 10:26:13

标签: oracle

我有以下三个表:

CREATE TABLE Flights (
  route_number INT NOT NULL PRIMARY KEY,
  operated_by INT NOT NULL,
  airplane_model  VARCHAR(30) NOT NULL,
  source VARCHAR(20),
  destination VARCHAR(20),
  FOREIGN KEY (operated_by) REFERENCES Airline(airline_id),
  FOREIGN KEY (airplane_model) REFERENCES Airplanes(airplane_id)
  );
CREATE TABLE outgoing (
  route_number INT NOT NULL PRIMARY KEY,
  poTime Date NOT NULL,
  FOREIGN KEY (route_number) REFERENCES Flights(route_number)
);

    CREATE TABLE incoming (
    route_number INT NOT NULL PRIMARY KEY,
    paTime date NOT NULL,
    FOREIGN KEY (route_number) REFERENCES Flights(route_number)
  );
  CREATE TABLE departures(
    depid int not null PRIMARY KEY,
  route_number INT NOT NULL,
   gate VARCHAR(3) NOT NULL,
    depT date NOT NULL,
    depD date NOT NULL,
status VARCHAR(10),
    FOREIGN KEY (route_number) REFERENCES Flights(route_number)
);  

      CREATE TABLE ARRIVALS(
  route_number INT NOT NULL,
   gate VARCHAR(3) NOT NULL,
    arrT date NOT NULL,
    arrD date NOT NULL,
status VARCHAR(10),
    arrid int not null PRIMARY KEY,
    FOREIGN KEY (route_number) REFERENCES Flights(route_number)
);   

我正在尝试创建一个约束,即在计划时间(paTime和poTime)间隔为-1,+ 1小时的计划时间内,没有两个航班可以拥有相同的门。

我以为我应该创建一个视图并插入到视图中...但显然你不允许在可更新的视图表中有子查询? 我将如何添加此约束?

注意:PaTime和PoTime是计划到达时间和计划出发时间,而arrT和depT是实际到达时间和实际出发时间,并且允许它们不同。

基本上是这样的: 1.航班被添加到航班表中(无需额外限制) 2.如果是入境航班,其计划到达时间将添加到抵达表中(再次无需担心限制)。 3.在“到达”表中,将实际到达时间(可能与计划到达时间不同),状态和门添加到表中。这是我需要约束的地方!检查此表中是否存在该门号以及离开时间表是否距其计划到达/离开时间为-1至+1小时。 所以对于这个表我需要一种方法来加入Incoming(用于Patime)Outgoing(用于Potime)时间并检查约束

1 个答案:

答案 0 :(得分:0)

约束只能引用一个表。如果您需要使用此数据模型,则无法创建满足所需要的约束。

您有几个选择

  1. 您可以创建一个存储过程,而不是创建约束,该存储过程执行新航班的INSERT并实现您想要的任何验证。然后,您可以限制应用程序在表上发出直接INSERT,并要求它使用存储过程。
  2. 您可以保留现有数据模型并创建一个ON COMMIT物化视图,该视图组合了离场和到达的数据,然后在该物化视图上创建约束。
  3. 您可以修改数据模型,以便约束所需的所有信息都在一个表中。