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

Posted

技术标签:

【中文标题】如何编写从布尔表达式查询中获取单个值的函数/触发器【英文标题】:How to write function/trigger that grabs single values from queries for a boolean expression 【发布时间】:2022-01-05 10:22:07 【问题描述】:

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

--已编辑--

我需要创建一个函数/触发器,它只允许我在我的 TICKET 中插入新行,前提是航班的票数不超过飞机的最大座位数。

您如何编写函数将单个值与查询隔离开来: 1) SELECT count(*) FROM ticket WHERE flight_id = x 2)SELECT maxSeats FROM plane where aircraft_code =(与航班相关的飞机代码)。

如何从这两个查询中获取单个值以进行检查(座位数

谢谢。

【问题讨论】:

编写一个返回所有你想要的行的查询。然后编写一个插入来修改该查询以插入这些行。如果没有要插入的行,则它不会插入任何行。这与任何插入有何不同? (修辞。)PS“希望在如何解决此类问题的总体正确方向上得到指出”不是一个有效的SO问题。 How to Ask Help center PS 诸如“需要比较值”之类的短语太含糊而无济于事。 minimal reproducible example 仍然没有minimal reproducible example。或研究的迹象。请不要要求我们编写您的代码。请在考虑向谷歌发布任何错误消息以及您的问题/问题/目标的许多清晰、简洁和准确的措辞之前,包括和不包括您的特定名称/字符串/数字、“site:***.com”和标签;阅读许多答案。 PS请不要“编辑”等,只是让你的帖子成为目前最好的演示文稿。请在发布之前查看编辑框下方帖子的格式化版本。阅读代码和引用的编辑帮助重新内联和块格式。也重新换行。请避免“谢谢”等。 研究如何使用TOP关键字。 【参考方案1】:

我需要执行以下操作: - 在 TICKET 表中插入新行,其中包含引用 FLIGHT 表的外键 (flight_id)。 - 更新刚插入机票的航班(flight_id)的 FLIGHT 表中的座位数(加一)。

您可以通过SELECT COUNT(*) FROM TICKET WHERE flight_id = flight_id 推导出“座位数”。在 FLIGHT 中添加 number of seats 属性会导致规范化错误,并迫使您将其与 FLIGHT 的 TICKET 保持同步。

我是否需要为此使用触发器或函数,以便在我尝试提交时简单地抛出错误?或者有没有办法为引用另一个表中的值的列设置一种特殊类型的约束(即。FLIGHT.num_seats_booked

在支持它的平台上,您可以添加一个 CHECK 约束,该约束调用一个函数,通过查询其他表来进行必要的检查。据我所知,虽然您可以在 Postgres 中执行此操作,但并发更新存在问题,建议使用触发器。

如果他们仍然有可用的航班座位,我只需要提交上述交易。

或者我应该在交易中使用 IF/ELSE 查询吗?

只是想在如何解决这类问题上找到正确的方向

与 Postgres 无关,但如果您有兴趣,请查看this 线程


如何编写一个函数来比较航班的票数和飞机的 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

【讨论】:

谢谢詹尼斯。我将通过查询门票表得出座位数。我该如何编写一个函数来比较航班的票数和飞机的 max_seats?我不确定如何从两个查询中获取单个值来比较它们并在函数中返回 true 或 false。 @mcdenyer 查看编辑后的答案 非常感谢。 @mcdenyer 欢迎您。如果它涵盖了您,请接受答案。 Giannis,您提到从航班中删除 num_seats_booked 会损害我的规范化表格。如果我的航班表只有一个键 PK(flight_id),那么 num_seats_booked 唯一依赖的就不是 pk。 flight_id -> num_seats_booked。我仍在努力了解规范化。你能解释一下这违反了哪种规范化形式吗?我试图让我的关系处于 3nf 或 BCNF。

以上是关于如何编写从布尔表达式查询中获取单个值的函数/触发器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 VBA 中的两个数组函数获取单个数组输出?

access中查询出来值的为空,如何将空值改为0,具体表达式是啥,从啥地方输入表达式,多谢

从 Uri 获取单个查询参数 [重复]

使用从同一个表中获取值的变量创建更新触发器的正确​​方法是啥?

T-SQL 函数在调用时表现为布尔表达式?

在此上下文中仅允许返回数字或布尔值的变量表达式