2

グループが次のようにモデル化されているデータベース アプリケーションがあります。

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ようにするためです。他の理由で (これについて詳しく説明する必要はないと思います)、group_owner_id をテーブルから削除されるため、単に削除することはできません。GroupItemGroupGroupItem

私の大きな問題は、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()
...

これを回避する方法はありますか?少しぎこちないようです。うまくいけば、私は十分な詳細を投稿しました。

ありがとう。

4

3 に答える 3

2

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 を更新するだけです。

于 2009-11-03T17:05:11.320 に答える
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 キーワードであり、テーブル名にすることはできません。ただし、実際のテーブルには実際の名前があると想定しているため、これは問題ではありません。

于 2009-11-03T23:48:18.680 に答える
0

更新ルールを追加して、変更をカスケードしようとする場合があります。

Microsoft Links
外部キー リレーションシップ ダイアログ ボックス (「更新規則」を参照)
論理レコードを使用した関連行への変更のグループ化

于 2009-11-03T17:10:05.437 に答える