Aktualisieren von Fremdschlüsselwerte
-
13-09-2019 - |
Frage
Ich habe eine Datenbank-Anwendung, in der eine Gruppe wie folgt modelliert:
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)
)
Wir haben einen Multi-Feld Fremdschlüssel einschließlich der group_owner_id
einzurichten, weil wir, dass ein GroupItem
sicherstellen wollen, nicht einen anderen Eigentümer als die Group
hat es in. Aus anderen Gründen (ich glaube nicht, dass ich ins Detail gehen muß auf diesem) kann die group_owner_id nicht aus der GroupItem
Tabelle entfernt werden, so dass nur das Entfernen es keine Option ist.
Mein großes Problem ist, wenn ich die group_owner_id
für die gesamte Gruppe aktualisieren will, ich Code wie diesen zu schreiben (in Pseudo-Code):
...
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()
...
Gibt es eine Möglichkeit, dies um zu tun? Es scheint ein bisschen klobig. Hoffentlich habe ich genug Detail geschrieben.
Danke.
Lösung
Ist SQL Server nicht UPDATE CASCADE unterstützen? : -
Foreign Key (group_id, group_owner_id)
references Group(group_id, group_owner_id)
ON UPDATE CASCADE
Dann aktualisieren Sie einfach die group_owner_id der Gruppe Tabelle.
Andere Tipps
Tony Andrew Vorschlag funktioniert. Zum Beispiel, sagen Sie den Eigentümer der Gruppe ändern 1 von 2 bis 5 mögen Wenn ON UPDATE CASCADE aktiviert ist, diese Abfrage:
update [Group] set group_owner_id = 5 where group_id = 1
automatisch alle Zeilen in GroupItem aktualisieren.
Wenn Sie keine Kontrolle über die Indizes und Schlüssel in der Datenbank, können Sie dieses Problem umgehen, indem man zuerst die neue Gruppe eingeführt wird, dann werden alle Zeilen in der abhängigen Tabelle ändern, und schließlich die ursprüngliche Gruppe zu löschen:
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
Durch die Art und Weise, GROUP ist ein SQL-Schlüsselwort und kann nicht ein Tabellenname sein. Aber ich nehme an, Ihre realen Tabellen echte Namen haben so dies kein Problem ist.
Sie könnten versuchen, eine Fortschreibungsregel kaskadieren Änderungen hinzuzufügen.
Microsoft Links
Fremdschlüsselbeziehungen Dialogfeld (siehe Update-Regel)
Gruppierung Änderungen an Verwandten Zeilen mit logischen Datensatz