1

既存のアプリケーションを含む 2 つのテーブル (MS SQL Server 2005) があります (インデックスなど以外の DB の変更は許可されていません)。

2 つのテーブルは次のとおりです。

ActivityDetails (Primary table)
    ActivityDetailkey (Primary key)

SubActivities (Child table)
    ActivityDetailKey (Refers to ActivityDetails)

現在、 には制約がありませSubActivitiesActivityDetailKey。基本的に、ActivityDetail各行には多くの行が存在する可能性がありSubActivities、ユーザーが行を削除して孤立したActivityDetailsままにすることを妨げるものは何もありません。SubActivities

アプリケーションには、これを防ぐ「ソフトロック」がいくつかあるはずでしたが、機能していないため、DB レイヤーにも整合性を向上させたいと考えていました。

しかし、SubActivitiesActivityDetailKey列がUNIQUEではないため、外部キーを追加できないようです。

ActivityDetails子供がいる場合に行を削除できないようにするにはどうすればよいですか?

ありがとう

編集

複雑で申し訳ありません。SubActivitiesテーブルの実際の名前はTEDetailSubActivitiesです。読みやすいように、質問でそれを変更しました。

とにかく、両方のテーブルの完全なスキーマの要点を次に示します。

https://gist.github.com/840479

助けていただければ幸いです。

4

2 に答える 2

2

外部キーを間違った方法で設定しようとしているようです - SubActivities に同じ ActivityDetailKey 値を持つ複数の行があり、これらが ActivityDetails の主キーへの参照である場合、次のように動作するはずです (に基づいて)投稿されたスキーマ、および現在テスト済み):

ALTER TABLE TEDetailSubActivities ADD CONSTRAINT FK_TEDetailSubActivities_ActivityDetails FOREIGN KEY
      (ActivityDetailKey) references dbo.ActivityDetails (ActivityDetailKey)

投稿のテーブル名に基づく以前のバージョン:

ALTER TABLE SubActivities ADD CONSTRAINT FK_SubActivities_ActivityDetails FOREIGN KEY
      (ActivityDetailKey) references ActivityDetails (ActivityDetailKey)

SubActivities の ActivityDetailKey 列に一意性要件はありません。

SubActivities にそれらを参照する行がある場合、そのままで、ActivityDetails からの行の削除を停止します。一方、アプリケーションで削除を続行できるようにしたいが、孤立した行を SubActivities に残さないようにしたい場合は、ON DELETE CASCADE上記の最後の閉じ括弧の後に追加します。


上記は、次のテーブル定義に基づいて機能します。データベースで機能しない場合は、データベースから実際のテーブル定義を投稿するか、表示されているものを模倣するのに「十分に近い」ものを投稿して、私たちを助ける必要があります。

create table ActivityDetails (
    ActivityDetailkey int not null Primary key
)
go
create table SubActivities (
    ActivityDetailKey int not null
)
go

はぁ。SSMS デザイナーの使用を主張する場合:

  • SubActivities を右クリックし、[デザイン] を選択します。
  • 「関係」ツールバーボタンを押します
  • 「追加」を押します
  • 「テーブルと列の仕様」プロパティに対して「...」を押します
  • [主キー テーブル] ドロップダウンで、[ActivityDetails] を選択します。
  • 下のグリッドで、両側の ActivityDetailKey を選択します
  • [OK]、[閉じる]、[保存] ツールバー ボタン、(必要に応じて) [はい] を押して保存の警告を表示します。
  • デザイナーを閉じます。
于 2011-02-23T13:30:30.370 に答える
2

子テーブルで複製されている場合でも、外部キーを持つことができます。たとえば、制約 WITH CHECK オプションを追加する必要があります。

ALTER TABLE [dbo].[SubActivities]  WITH CHECK ADD  CONSTRAINT [FK_SubActivities_ActivityDetails] FOREIGN KEY([ActivityDetailkey])
REFERENCES [dbo].[ActivityDetails ] ([ActivityDetailkey])

それが役に立てば幸い!

于 2011-02-23T13:30:44.630 に答える