0

我有这个:

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));
4

3 回答 3

0

这样的事情会告诉你。

 select city, count(city) citycount
 from airport
 group by city
 having count(city) >=3
于 2013-03-10T15:45:26.817 回答
0

“能查到一个城市的机场不超过3个吗?”

不使用规范化数据模型,仅使用 create table 语句。

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

唯一安全的方法是使用存储计数的提交时物化视图,并在 MV 表的计数列上设置约束以防止其超过 3。

于 2013-03-10T18:35:25.570 回答
-2

如果您在数据库中编写触发器,则以下 sql 将为您提供机场计数-

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

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

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

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

于 2013-03-10T15:55:12.727 回答