我有一个数据库应用程序,其中一个组建模如下:
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
不同的所有者。由于其他原因(我认为我不需要详细说明)无法从GroupItem
表中删除group_owner_id,因此只是删除它不是一个选项。
我的大问题是,如果我想更新整个组的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()
...
有办法解决这个问题吗?看起来有点笨重。希望我已经发布了足够的细节。
感谢。
答案 0 :(得分: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 :(得分:1)
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关键字,不能是表名。但我认为你的真实桌子有实名,所以这不是问题。
答案 2 :(得分:0)
您可能会尝试添加更新规则以级联更改。
Microsoft链接
Foreign Key Relationships Dialog Box (see Update Rule)
Grouping Changes to Related Rows with Logical Records