Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:负自动增量?_Sql_Database_Oracle_Stored Procedures_Triggers - Fatal编程技术网

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_模型。