gpt4 book ai didi

sql - 防止 MS-SQL 表中的循环引用

转载 作者:行者123 更新时间:2023-12-01 10:19:27 24 4
gpt4 key购买 nike

我有一个带有 ID 和 ParentAccountID 的帐户表。这是重现这些步骤的脚本。

如果 ParentAccountID 为 NULL,则将其视为顶级帐户。
每个帐户最终都应以顶级帐户结尾,即 ParentAccountID 为 NULL

    Declare @Accounts table (ID INT, ParentAccountID INT )    


INSERT INTO @Accounts values (1,NULL), (2,1), (3,2) ,(4,3), (5,4), (6,5)

select * from @Accounts

-- Request to update ParentAccountID to 6 for the ID 3
update @Accounts
set ParentAccountID = 6
where ID = 3

-- Now the above update will cause circular reference
select * from @Accounts

当请求来更新一个账户的 ParentAccountID 时,如果这导致循环引用,那么在更新之前需要识别它。

任何想法伙计们!!

最佳答案

您似乎为您的表定义了一些业务规则:

  • 所有链必须以顶级账户结束
  • 链可能没有循环引用

  • 您有两种方法可以强制执行此操作。

    您可以创建一个 trigger在您的数据库中,并检查触发器中的逻辑。这具有在数据库内部运行的好处,因此它适用于每个事务,而不管客户端如何。然而,数据库触发器并不总是流行的。我将它们视为 side effect ,而且它们很难调试。触发器作为 SQL 的一部分运行,所以如果它们很慢,你的 SQL 就会很慢。

    另一种方法是在应用程序层强制执行此逻辑 - 无论与您的数据库对话。这更容易调试,并使您的业务逻辑对新开发人员显式 - 但它不在数据库内运行,因此如果您有多个客户端应用程序,您最终可能会复制逻辑。

    关于sql - 防止 MS-SQL 表中的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55456164/

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