2

我有一个数据库应用程序,其中一个组的建模如下:

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因为我们要确保 aGroupItem不能拥有与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()
...

有没有办法做到这一点?它似乎有点笨拙。希望我已经发布了足够的细节。

谢谢。

4

3 回答 3

2

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。

于 2009-11-03T17:05:11.320 回答
1

托尼安德鲁的建议奏效。例如,假设您想将组 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 关键字,不能是表名。但我假设你的真实表格有真实姓名,所以这不是问题。

于 2009-11-03T23:48:18.680 回答
0

您可能会尝试添加更新规则来级联更改。

Microsoft 链接
外键关系对话框(请参阅更新规则)
使用逻辑记录对相关行的更改进行分组

于 2009-11-03T17:10:05.437 回答