2009-11-03 124 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關鍵字,不能是表名。但我認爲你的真實表格有真名,所以這不是問題。