更新外键值

时间:2009-11-03 16:59:03

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

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

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()
...

有办法解决这个问题吗?看起来有点笨重。希望我已经发布了足够的细节。

感谢。

3 个答案:

答案 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