检查创建表

时间:2013-03-10 15:39:10

标签: sql oracle

我有这个:

create table airport
(idairport varchar(1),
name varchar(1),
city varchar(1),
primary key(idairport));

是否可以检查一个城市的机场不超过3个?

编辑:

练习是:

将概念架构转换为关系模型。我们想知道,每个机场,那里的飞机和可能的目的地。如果模型未规范化,则将其标准化,避免存在空值。

约束:

  • 没有任何航班离开机场并降落在同一地点 机场。
  • 一个城市最多有三个机场。

解决方案必须是一组“CREATE TABLE”句子。表达尽可能多的完整性约束。由于关系转换而仅指定所有“NOT NULL”。此外,您不应忘记定义必要的外键和替代键(UNIQUE + NOT NULL)。

翻译后(如果我没错):

create table aircraft
(idaircraft varchar(1),
seating varchar(1),
primary key(idaircraft));

create table destination
(idairportorigin varchar(1) references airport(idairport),
idairportdestination varchar(1) references airport(idairport),
idaircraft varchar(1),
check(idairportorigin <> idairportdestination),
primary key(idairportorigin, idairportdestination, idaircraft),
foreign key (idaircraft) references aircraft(idaircraft));

3 个答案:

答案 0 :(得分:0)

这样的事情会告诉你。

 select city, count(city) citycount
 from airport
 group by city
 having count(city) >=3

答案 1 :(得分:0)

“是否可以检查一个城市的机场不超过3个?”

不使用标准化数据模型,仅使用create table语句。

即使单独使用触发器也是不够的,因为读取一致性会阻止事务看到其他未经通信的事务。

这样做的唯一安全方法是使用存储计数的on-commit物化视图,并在MV表的count列上放置一个约束,以防止它超过3。

答案 2 :(得分:-2)

如果你在你的数据库中写入触发器,那么下面的sql将为你提供机场数量 -

select count(idairport) from airport where city = 'entered city'

然后您可以在预插入或更新前触发器中放弃添加任何机场。

如果你使用一些编程api,如jdbc等 -

然后通过上面的sql,您将在输入/更新任何数据之前计算机场数,然后您可以从此编码点放弃添加/更新。