gpt4 book ai didi

sql - 使用 SQL 定义一对多关系

转载 作者:行者123 更新时间:2023-11-29 11:36:27 26 4
gpt4 key购买 nike

我正在寻找一种在 2 个表之间建立一对多关系的方法。表结构在下面进行了解释,但我试图将与问题无关的所有内容都去掉。

objects 有 1 个名为 uuid 的列。

contents 有 3 列,分别是 contentobject_uuidtimestamp

基本思想是向objects 中插入一行,并从数据库中获取一个新的uuid。此 uuid 然后用于存储在 contents 中的每一行,以将内容与对象相关联。

现在我正在尝试使用数据库来强制执行:

  • contents 中的每一行都引用了 objects 中的一行(外键应该可以)
  • 如果 contents 中至少有一个 row,则 objects 中的任何行均不存在

这些约束应该在事务提交时强制执行。

普通的触发器可能帮不上忙,因为当objects表中的一行被写入时,contents中还不能有一行。 Postgres 确实有所谓的 constraint triggers 可以延迟到事务结束。可以使用它们,但它们似乎是某种不适合日常使用的内部结构。

想法或解决方案应该是标准 SQL(首选)或使用 Postgres(版本无关紧要)。感谢您的任何输入。

最佳答案

你的主要问题是除了外键约束;没有约束可以引用另一个表。

最好的办法是将其稍微非规范化,并在 object 上有一列,其中包含引用它的 contents 的计数。您可以创建触发器以使其保持最新状态。

contents_count INTEGER NOT NULL DEFAULT 0

除非您对谁可以更新此列设置一些用户安全措施,否则这不会那么牢不可破。但是,如果您通过触发器使其保持最新状态并且您希望避免的只是意外损坏,那么这就足够了。

编辑:根据评论,CHECK 约束不可延迟。如果删除所有内容,即使打算在同一事务中添加更多内容,此解决方案也会引发错误。

关于sql - 使用 SQL 定义一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com