SQL:负自动增量?

时间:2011-01-17 01:10:55

标签: sql database oracle stored-procedures triggers

每次将新行条目添加到available_seats

时,我想自动减少FLIGHT表中的值FLIGHT_PLAN

FLIGHT_PLAN定义为:

FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER)

FLIGHT定义为

FLIGHT (flight_number NUMBER, available_seats NUMBER) 

我应该使用存储过程,触发器吗?

4 个答案:

答案 0 :(得分:5)

如果这样做,您将在DB中多次存储相同的数据,这是一种优化。您确定需要优化吗?

  • 如果您这样做,请查找触发器。您可能希望在创建,更新和删除FLIGHT_PLAN表时触发以调整FLIGHT表。

  • 如果您不需要优化,或者您还不确定是否需要优化,请不要进行优化。您可以快速查询已分配席位的数量,并从中计算出您想要的remaining_seats值:

    SELECT FLUNT(*)FROM FLIGHT_PLAN,其中PLAN_NUMBER =?

    SELECT total_seats FROM FLIGHT;

    ...

    $ available_seats - $ total_seats - $ occupied_seats;

答案 1 :(得分:3)

我将在存储过程中处理整个过程。更容易阅读和管理必要的锁定(即确保当A人在与B人完全相同的时间添加飞行计划时,您不会获得负面可用座位。)

答案 2 :(得分:2)

结合您的其他问题here我建议您保持数据的标准化。

FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER)
FLIGHT (flight_number NUMBER, model_id NUMBER) 
PLANE_MODEL(NUMBER model_id, NUMBER capacity)

将model_id添加到FLIGHT中,这将为您提供通过联接的航班容量。要了解可用的座位数,您可以使用查询:

SELECT F.flight_number, M.capacity, M.capacity - COALESCE((
    SELECT count(*) FROM FLIGHT_PLAN P
    WHERE P.flight_number = F.flight_number
    ), 0) as AvailableSeats
FROM FLIGHT F
INNER JOIN PLANE_MODEL M ON M.model_id=F.model_id

答案 3 :(得分:0)

  

我更喜欢SQL proc,即增量   和减少(毫无疑问其他   数据)在单个交易中。

使用FLIGHT_PLAN上的触发器可以解决它。以下检查使其成为现实:

Alter Table FLIGHT Add
  Constraint FLIGHT_AVAIL_SEATS_CHK
  Check (available_seats >= 0);