【问题标题】:Updating foreign key values更新外键值
【发布时间】:2009-11-03 16:59:02
【问题描述】:

我有一个数据库应用程序,其中一个组是这样建模的:

TABLE Group
(
  group_id integer primary key,
  group_owner_id integer
)

TABLE GroupItem
(
  item_id integer primary key,
  group_id integer,
  group_owner_id integer,
  Foreign Key (group_id, group_owner_id) references Group(group_id, group_owner_id)
)

我们设置了一个包含group_owner_id 的多字段外键,因为我们要确保GroupItem 的所有者不能与它所在的Group 的所有者不同。出于其他原因(我不认为我需要详细说明)group_owner_id 无法从GroupItem 表中删除,因此仅删除它不是一种选择。

我的大问题是如果我想为整个组更新group_owner_id,我正在编写这样的代码(在伪代码中):

...
BeginTransaction();
BreakForeignKeys(group_items);
SetOwnerId(group, new_owner_id);
SaveGroup(group);
SetOwnerId(group_items, new_owner_id);
SetForeignKeys(group_items, group);
SaveGroupItems(group_items);
CommitTransaction()
...

有没有办法解决这个问题?它似乎有点笨拙。希望我已经发布了足够的详细信息。

谢谢。

【问题讨论】:

    标签: sql sql-server foreign-key-relationship


    【解决方案1】:

    SQL Server 不支持 UPDATE CASCADE 吗? :-

    Foreign Key (group_id, group_owner_id)
     references Group(group_id, group_owner_id)
     ON UPDATE CASCADE
    

    然后您只需更新 Group 表的 group_owner_id。

    【讨论】:

    • +1 这个可行,虽然 Group 是保留关键字,不能是表名
    【解决方案2】:

    Tony Andrew 的建议有效。例如,假设您想将组 1 的所有者从 2 更改为 5。启用 ON UPDATE CASCADE 时,此查询:

    update [Group] set group_owner_id = 5 where group_id = 1
    

    将自动更新 GroupItem 中的所有行。

    如果您不控制数据库中的索引和键,您可以通过首先插入新组,然后修改依赖表中的所有行,最后删除原始组来解决此问题:

    insert into [Group] values (1,5)
    update [GroupItem] set group_owner_id = 5 where group_id = 1
    delete from [Group] where group_id = 1 and group_owner_id = 2
    

    顺便提一下,GROUP是SQL关键字,不能是表名。但我假设你的真实表格有真实姓名,所以这不是问题。

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 2010-12-07
        • 2019-06-22
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多