SQL:负自动增量?
每次向航班计划表添加新行条目时,我想自动减少航班表中的可用座位数 飞行计划定义为:SQL:负自动增量?,sql,database,oracle,stored-procedures,triggers,Sql,Database,Oracle,Stored Procedures,Triggers,每次向航班计划表添加新行条目时,我想自动减少航班表中的可用座位数 飞行计划定义为: FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER) 飞行的定义是 FLIGHT (flight_number NUMBER, available_seats NUMBER) 我是否应该使用存储过程、触发器来执行此操作?我将在存储过程中处理整个过程。更易于阅读和管理必要的锁定,即确保当人员A与人员B同时添加飞行计划时,您不会获得负可用座位。如果您添加了
FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER)
飞行的定义是
FLIGHT (flight_number NUMBER, available_seats NUMBER)
我是否应该使用存储过程、触发器来执行此操作?我将在存储过程中处理整个过程。更易于阅读和管理必要的锁定,即确保当人员A与人员B同时添加飞行计划时,您不会获得负可用座位。如果您添加了,您将在数据库中多次存储相同的数据,这是一种优化。您确定需要优化吗 如果是,请查找触发器。您可能希望在创建、更新和删除航班计划表时触发,以调整航班表 如果您不需要优化,或者您还不确定是否需要,请不要优化。您可以快速查询已分配的座位数,并从中计算所需的剩余座位数: 从航班计划中选择计数*,其中计划号= 从航班中选择总座位 $可用座位-$总座位-$已占用座位
结合你的另一个问题,我建议你保持数据正常化
FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER)
FLIGHT (flight_number NUMBER, model_id NUMBER)
PLANE_MODEL(NUMBER model_id, NUMBER capacity)
将model_id添加到航班中,这将通过连接为您提供航班的容量。要了解有多少座位可用,您可以使用查询:
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
我更喜欢SQL过程,即增量
还有减量,毫无疑问还有其他
单个事务中的数据
只要在飞行计划上扣动扳机,你就能解决它。下面的检查使其循环:
Alter Table FLIGHT Add
Constraint FLIGHT_AVAIL_SEATS_CHK
Check (available_seats >= 0);
您确定需要优化吗?-这一点很好,但我更喜欢SQL过程,即递增和递减,毫无疑问,在单个事务中还有其他数据。支持标准化的一个有力论据是并发性:如果同一航班由两个并行进程修改,那么非标准化的座位数很容易变得不正确。防止这种情况的唯一方法是序列化事务,这将影响可伸缩性。正如@ijw和@cyberkiwi所建议的,标准化方法消除了序列化的需要,并确保导出的值始终正确。尽管这是一个相互竞争的答案,但这里的+1是因为您合并了另一个问题中的PLANE_模型。