提问人:mcdenyer 提问时间:11/28/2021 最后编辑:mcdenyer 更新时间:11/29/2021 访问量:222
如何编写从布尔表达式的查询中获取单个值的函数/触发器
How to write function/trigger that grabs single values from queries for a boolean expression
问:
我正在使用 javascript 和 postgres 数据库开发一个模拟机票预订应用程序。
--编辑--
我需要创建一个函数/触发器,只有当航班的机票数量不超过飞机的最大座位数时,我才允许在我的机票中插入新行。
如何编写函数将单个值与查询隔离: 1)从工单中选择 count(*),其中 flight_id = x 2)选择 maxSeats FROM airplane,其中 aircraft_code =(飞机的代码与航班相关)。
如何从这两个查询中获取要检查的单个值(席位数 <= max_seats)。
谢谢。
答:
我需要执行以下操作的事务: -USE TICKET 表中的新行,其中包含引用 FLIGHT 表的外键 (flight_id)。- 更新刚刚插入机票的航班(flight_id)的 FLIGHT 表中的座位数(增加 1)。
您可以通过以下公式推导出“席位数”。在 FLIGHT 中添加属性将是一个规范化错误,并强制您将其与 FLIGHT 的 TICKET 保持同步。SELECT COUNT(*) FROM TICKET WHERE flight_id = {flight_id}
number of seats
我是否需要为此使用触发器或函数,当我尝试提交时只会抛出错误?或者有没有办法为引用另一个表中的值的列设置一种特殊的约束(即。FLIGHT.num_seats_booked < AIRPLANE.max_num_seats.)
在支持它的平台中,您可以添加一个 CHECK 约束,该约束调用函数通过查询其他表来执行必要的检查。据我所知,虽然您可以在 Postgres 中执行此操作,但并发更新存在问题,建议使用触发器。
我只需要在航班仍有空位的情况下提交上述交易。
或者我应该在事务中使用 IF/ELSE 查询?
只是想在如何处理此类问题方面指出总体正确的方向
与 Postgres 无关,但如果您有兴趣,请查看此线程
如何编写一个函数来比较航班的机票数量和飞机的机票max_seats?我不确定如何从两个查询中获取单个值来比较它们并在函数中返回 true 或 false。
像这样的东西会起作用:
SELECT COUNT(*) < (
SELECT MaxSeats
FROM Flight
INNER JOIN Aircraft
ON Aircraft.AircraftCode = Flight.AircraftCode
WHERE FlightId = {flightId})
FROM Ticket
WHERE FlightId = {flightId}
评论