web-dev-qa-db-ja.com

外部キーにON DELETE NO ACTIONを指定する必要がありますか?

SQL Server 2012で使用している次のDDLがあります。

CREATE TABLE Subject (
   [SubjectId] INT IDENTITY (1, 1) NOT NULL,
   [Name] NVARCHAR (50) Not NULL,
   CONSTRAINT [PK_Subject] PRIMARY KEY CLUSTERED ([SubjectId] ASC)
)           

CREATE TABLE Topic (
   [TopicId] INT IDENTITY (1, 1) NOT NULL,
   [Name] NVARCHAR (50) NOT NULL,
   [SubjectId] INT NOT NULL,
   CONSTRAINT [PK_Topic] PRIMARY KEY CLUSTERED ([TopicId] ASC)
)
ALTER TABLE [Topic] WITH CHECK ADD  CONSTRAINT [FK_TopicSubject] 
   FOREIGN KEY([SubjectId]) REFERENCES [Subject] ([SubjectId]) 
   ON DELETE NO ACTION

その親への参照が子に存在する場合、SQL Serverは親の削除を停止しますか?たとえば、SubjectIdが3の子が存在する場合、SubjectのsubjectID = 3の削除を失敗させます。

このため、私は不明瞭であり、答えを見つけることができないようです。 「DELETE NO ACTION」を追加する必要がありますか、それともこれら3つの単語を削除しないだけですか。

親にトリガーを定義する必要があるという回答があった同様の質問と同様に、私はこの質問をしています。ただし、外部キーを定義するだけで、子が存在する場合は親を削除できなくなると思いました。

18
user1943020

[〜#〜] msdn [〜#〜] のcolumn_constraintページから:

削除時{アクションなし|カスケード| SET NULL |デフォルト設定}

それらの行に参照関係があり、参照された行が親テーブルから削除された場合、変更されたテーブル内の行に何が起こるかを指定します。デフォルトはNO ACTIONです。

したがって、_ON DELETE NO ACTION必要に応じて、同じように機能します。

NO ACTIONは、SubjectテーブルからTopicテーブルに削除しても何も起こらないことを意味します。その場合、特定のSubjectIdのトピックに行がある場合、参照整合性を壊さずにその行から削除することはできないため、削除はロールバックされます。

MSDNの詳細:

NO ACTION-SQL Serverデータベースエンジンはエラーを発生させ、親テーブルの行に対する削除アクションはロールバックされます。

30
DaveShaw

On delete noアクションをスキップすることはできますが、そうすることは最善の利益にならない可能性があることをお勧めします。テーブル定義でこれを指定すると、後で誰かがカスケード削除を追加できなくなる可能性があります。これは、すべてのデータベースオブジェクトを正しくスクリプト化してソース管理に配置し、コードレビュアーが違いがあることを確認し、それが発生した理由を尋ねる場合に特に当てはまります。多くの場合、人々は削除カスケードを追加したり、保持されるべきデータ(有効ではなくなった顧客の財務記録など)を破棄したがります。削除できないエラーが発生するため、これを行うのは、これが大きな間違いからユーザーを救うことに気付くのではなく、単に削除したいからです。少なくとも、テーブルスクリプトにアクションなしの削除のコードがある場合、将来のメンテナーは、これが意図的なものであり、カスケード削除のセットアップを忘れたことだけではないことがわかります。もちろん、dbaでカスケード削除が許可されていない場合(多くの場合、正当な理由で許可されていません!)、これは潜在的な問題ではありませんが、メンテナンス性のために意図を指定することはしばしば良いことです。

4
HLGEM

「ON DELETE NO ACTION」は、実質的に「ON DELETE」と同じです。

「ヘッダー」を削除するときに必要なアクションについてプログラマーの考えを明確にし、それに関連する「行」がある場合は「ヘッダー」を削除しないことを決定するために使用するとよいことに同意します。ただし、Visual Studioでデータベースを定義しているため、「ON DELETE」から「ON DELETE NO ACTION」への変更の更新を拒否しています。更新しても、「削除中」のままです。

0
TomLak