6

次のコードがあります

--first statement
ALTER TABLE [nameOfMyTable]  WITH CHECK ADD  CONSTRAINT [nameOfMyConstraint] FOREIGN KEY([myFK])
REFERENCES [tableReference] ([myFK])
GO
--second statement
ALTER TABLE [nameOfMyTable] CHECK CONSTRAINT [nameOfMyConstraint]
GO

まず、テーブルに CHECK 制約を定義します。2番目のステートメントとはどういう意味ですか?

4

3 に答える 3

7

2 番目のステートメントは冗長です。必要になるのは、最初のステートメントにWITH NOCHECK. WITH CHECK明示的に記載しない場合、CHECKまたはステートメントNOCHECKで指定しない場合、デフォルトで追加されます。ADD CONSTRAINT

SQL Server Management Studio はデフォルトでこのコードを生成します – Mikhail

コードは自動生成されているため、一連の手順によって構築されているだけです。これらの手順の一部は重複しているため、「テーブル定義」手順では、テーブルの作成中に制約のチェックを有効または無効にすることができますが、「制約の設定」手順でも制約を有効または無効にすることができます。

関連ドキュメント:

チェック付き | ノーチェックあり

  • テーブル内のデータが、新しく追加または再有効化された FOREIGN KEY または CHECK 制約に対して検証されるかどうかを指定します。指定しない場合、新しい制約には WITH CHECK が想定され、再有効化された制約には WITH NOCHECK が想定されます。

  • 新しい CHECK または FOREIGN KEY 制約を既存のデータに対して検証したくない場合は、WITH NOCHECK を使用します。まれなケースを除いて、これを行うことはお勧めしません。新しい制約は、以降のすべてのデータ更新で評価されます。制約が追加されたときに WITH NOCHECK によって抑制された制約違反があると、制約に準拠しないデータで行を更新すると、将来の更新が失敗する可能性があります。

  • クエリ オプティマイザーは、WITH NOCHECK で定義された制約を考慮しません。このような制約は、ALTER TABLE WITH CHECK CHECK CONSTRAINT ALL を使用して再度有効にするまで無視されます。

{ チェック | NOCHECK } 制約

  • constraint_name を有効にするか無効にするかを指定します。このオプションは、FOREIGN KEY および CHECK 制約でのみ使用できます。NOCHECK が指定されている場合、制約は無効になり、列への将来の挿入または更新は制約条件に対して検証されません。DEFAULT、PRIMARY KEY、および UNIQUE 制約は無効にできません。
于 2013-08-01T13:49:23.763 に答える
1

指定されたコンテキストの 2 番目のステートメントは、制約の作成直後に実行すると冗長になります ( out without を使用しない場合、 with を使用しWITH CHECKて外部キー制約を作成すると、デフォルトADD CONSTRAINT FOREIGN KEYですぐに実行WITH CHECKされます)。

2 番目のステートメントは、制約チェックを再度有効にするために使用されます。

ALTER TABLE [nameOfMyTable] CHECK CONSTRAINT [nameOfMyConstraint];

通常、次のように無効にされた後:

ALTER TABLE [nameOfMyTable] NOCHECK CONSTRAINT [nameOfMyConstraint];
GO

スクリプト ツールは、このような DDL を作成することがよくあります。

3 番目のフレーバーがあります。これは、たとえば、制約を無効にした (信頼できないとマークされた) 可能性のある一括コピーなどを実行した後に、制約の有効性を再確認することです。これは次のように行われます。

ALTER TABLE [nameOfMyTable] WITH CHECK CHECK CONSTRAINT [nameOfMyConstraint];

編集うまくいけば、この SQLFiddle はこれを解決しますか?

于 2013-08-01T13:52:53.540 に答える
1

ドキュメントから:

constraint_name を有効にするか無効にするかを指定します。このオプションは、FOREIGN KEY および CHECK 制約でのみ使用できます。NOCHECK が指定されている場合、制約は無効になり、列への将来の挿入または更新は制約条件に対して検証されません。DEFAULT、PRIMARY KEY、および UNIQUE 制約は無効にできません。

于 2013-08-01T13:48:47.543 に答える