【问题标题】:Best practices to get a new row id from database从数据库中获取新行 ID 的最佳实践
【发布时间】:2026-02-10 14:10:02
【问题描述】:

您好,我正在创建一个项目,其中我实际上有 3 个相关表,这些表连接到一个表,如下所示

表 1

id
name

表 2

id
tb1_id
random_thing

表 3

id
tb1_id
random_thing

我基本上不能选择我可以先在 table1 中创建一行然后 tb2,tb3 的选项。客户希望在单个按钮上完成所有操作。所以我在调用页面时创建一个新的空白行并获取新的tb1_id,然后链接所有内容并使用单个按钮,但问题是我可以删除未使用的行大概 2-3 天后,但 这太荒谬了 那么还有其他最佳实践来克服这种情况吗?

编辑

举例说明会很有帮助,我很适合使用任何数据库或任何语言,只是示例必须很好,这样我才能理解它是如何完成的。抱歉,但我是其中之一那些讨厌理论而喜欢实践的人:d

【问题讨论】:

    标签: database web-applications relational-database


    【解决方案1】:

    最佳做法是使用显式外键关系和事务。

    所以,基本思路是:

    1. 开始交易。
    2. 在表 1 中插入一行名称。
    3. 获取新创建行的 ID,最好使用 returningoutput 子句(取决于数据库)。
    4. 在表 2 中插入一行。
    5. 在表 3 中插入​​一行。
    6. 提交事务。

    使用事务时,如果由于任何原因没有完成,请小心回滚事务。

    至于删除行,您可以在外键定义上设置“级联删除”选项,因此如果父行被删除,则相关行也会被删除。

    一些数据库(尤其是 Postgres)提供了一些功能,您可以使用修改数据的 CTE 将所有这些放入单个语句中。这个想法还是一样的,只是更容易编码。

    我应该注意到有完全合理的选择。例如,您可以在三个表的“数据”列上创建一个视图,并在该视图上创建插入/更新/删除触发器。就个人而言,我发现将此功能隐藏在触发器中会使其更难以理解和维护。我认为这是个人意见,这也是一种合理的做法。

    【讨论】:

    • 嗨,谢谢你的回复,我很高兴使用任何数据库,你能告诉我一个使用任何数据库的例子吗(如果教程很好,语言就无关紧要),我没有使用趋势nosql 等,但知识仍然是神圣的 :) 所以也可以。
    • @noobProgrammer 。 . .对于您使用的任何数据库,请查看有关事务的文档。这通常是一个不错的起点。
    • 我想所以我可以得到一些答案,而不是阅读文档的建议。说真的,我尊重你给我的答案我只是想要一个例子,如果你做过,你必须有一个示例代码,这就是我的想法,或者你只是在脑海中写下声音,而不确定它是否有效