2009-11-03 97 views
0

我有其中一组是仿照这样的数据库应用程序:更新外键值

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不能有与其所有者不同。由于其他原因(我认为我不需要详细说明),无法从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() 
... 

有没有办法解决这样做呢?看起来有点笨重。希望我已经发布了足够的细节。

谢谢。

回答

1

SQL Server不支持UPDATE CASCADE吗? : -

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

然后,您只需更新组表的group_owner_id。

+0

+1虽然Group是保留关键字,但不能成为表名 – Andomar 2009-11-03 23:49:34

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关键字,不能是表名。但我认为你的真实表格有真名,所以这不是问题。