如何编写从布尔表达式的查询中获取单个值的函数/触发器

How to write function/trigger that grabs single values from queries for a boolean expression

提问人:mcdenyer 提问时间:11/28/2021 最后编辑:mcdenyer 更新时间:11/29/2021 访问量:222

问:

我正在使用 javascript 和 postgres 数据库开发一个模拟机票预订应用程序。

--编辑--

我需要创建一个函数/触发器,只有当航班的机票数量不超过飞机的最大座位数时,我才允许在我的机票中插入新行。

如何编写函数将单个值与查询隔离: 1)从工单中选择 count(*),其中 flight_id = x 2)选择 maxSeats FROM airplane,其中 aircraft_code =(飞机的代码与航班相关)。

如何从这两个查询中获取要检查的单个值(席位数 <= max_seats)。

谢谢。

postgresql 设计 关系数据库 q

评论

1赞 philipxy 11/28/2021
编写一个查询,返回所需的所有行。然后编写一个插入,修改该查询以插入这些行。如果没有要插入的行,则它不会插入任何行。这与任何插入物有何不同?(修辞。PS“希望在如何处理此类问题方面指向总体正确的方向”不是一个有效的 SO 问题。如何询问 帮助中心 PS 像“需要比较值”这样的短语太模糊了,没有帮助。最小可重复示例
0赞 philipxy 11/29/2021
仍然没有最小的可重复示例。或研究的迹象。请不要要求我们编写您的代码。在考虑发布谷歌任何错误消息和许多清晰,简洁和精确的措辞之前,您的问题/问题/目标,没有您的特定名称/字符串/数字,“site:stackoverflow.com”和标签;阅读许多答案。PS 请不要“编辑”等,只需使您的帖子成为目前最好的演示文稿。请在发布之前查看编辑框下方的帖子格式版本。阅读代码和引号的内联和块格式的编辑帮助。还要重新换行。请避免“谢谢”等。
0赞 Wes Palmer 11/29/2021
研究如何使用 TOP 关键字。

答:

2赞 Giannis Tsimarakis 11/28/2021 #1

我需要执行以下操作的事务: -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}

评论

0赞 mcdenyer 11/28/2021
谢谢扬尼斯。我将通过查询票表来推导出座位数。如何编写一个函数来比较航班的机票数量和飞机的机票max_seats?我不确定如何从两个查询中获取单个值来比较它们并在函数中返回 true 或 false。
0赞 Giannis Tsimarakis 11/29/2021
@mcdenyer 查看编辑后的答案
0赞 Giannis Tsimarakis 11/29/2021
@mcdenyer 不客气。如果它涵盖了你,请接受答案。
0赞 mcdenyer 12/1/2021
扬尼斯,你提到从航班上消除num_seats_booked会损害我的正常化形式。如果我的飞行表只有一个键 PK(flight_id),那么num_seats_booked所依赖的唯一东西不是 pk. flight_id ->num_seats_booked。我仍在努力理解规范化。您能解释一下这违反了哪种规范化形式吗?我正在尝试使我的关系处于 3nf 或 BCNF 中。
0赞 Giannis Tsimarakis 12/2/2021
@mcdenyer 对不起,我不确定。这绝对是多余的数据,这自然让我感到可以进一步规范化。没有考虑 NF 以及是否/如何以这种方式将其归类为归一化错误。既然您有一个存储相关事实的机票实体,您还能将“num_seats_booked”视为在功能上仅依赖于航班PK吗?我会尽力回复你。