SQLServerで一時的に外部キー(foreign key)制約を無効にする方法

記事内に広告が含まれています。

SQLServerでテーブルに設定されている外部キーを一時的に無効にしたり有効にしたりする方法です。

そもそも外部キーとは「ウィキペディア」によると

外部キー(foreign key、FK)とはは、コンピュータの関係データベースの関係モデルの文脈において、2つの関係変数(表)の間の参照整合性制約をいう。

となんだか難しいですね。

簡単に言うと「あるテーブルのレコードの値を他のテーブルで使っているかどうかをチェックできまよ」といったようなことです。

これができると、例えばマスターにあるレコードを消そうとしたときに、そのレコードの値(主にキー)が使われていたら消せないよということがプログラミングなしにできます。

外部キー(foreign key)の作り方

外部キー(foreign key)を作るにはチェックする側のテーブルにカラムを指定して作成します。

外部キー(foreign key)を作るには新規にテーブルを作成するタイミングと、すでに作成されているテーブルに設定する2つの方法があります。

新規テーブルに外部キー(foreign key)を作成する

新規にテーブルに外部キー(foreign key)を作成するにはCREATE TABLE文で指定します。

CREATE TABLE Sales.TempSalesReason 
   (
      TempID int NOT NULL, Name nvarchar(50)
      , CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID)
      , CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
        REFERENCES Sales.SalesReason (SalesReasonID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
   )
;

既存テーブルに外部キー(foreign key)を作成する

既存のテーブルに外部キー(foreign key)を作成するにはALTER TABLE文で指定します。

ALTER TABLE Sales.TempSalesReason
   ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
      REFERENCES Sales.SalesReason (SalesReasonID)
      ON DELETE CASCADE
      ON UPDATE CASCADE
;

外部キー(foreign key)を一時的に無効にする

外部キー(foreign key)を一時的に無効にはALTER TABLE文で指定します。

テーブルに属する外部キー(foreign key)すべての有効/無効を切り替える

テーブルに属する外部キー(foreign key)すべての有効/無効を切り替える方法です。

--テーブルに関係するすべての外部キー(foreign key)を無効にする
ALTER TABLE [対象のテーブル] NOCHECK CONSTRAINT ALL

--テーブルに関係するすべての外部キー(foreign key)を有効にする
ALTER TABLE [対象のテーブル] WITH CHECK CHECK CONSTRAINT ALL

テーブルに属する外部キー(foreign key)の指定したものの有効/無効を切り替える

テーブルに属する外部キー(foreign key)の指定したものの有効/無効を切り替える方法です。

--テーブルに関係する外部キー(foreign key)を指定して無効にする
ALTER TABLE [対象のテーブル] NOCHECK CONSTRAINT [対象の外部キー(foreign key)] 

--テーブルに関係する外部キー(foreign key)を指定して有効にする
ALTER TABLE [対象のテーブル]WITH CHECK CHECK CONSTRAINT [対象の外部キー(foreign key)] 

まとめ

SQLServerでテーブルに設定されている外部キーを一時的に無効にしたり有効にしたりするにはALTER TABLE文を使って行うことが簡単にできます。

テーブルのデータを全件消して全件再挿入したりする場合に使えると思います。
(データの整合性には注意が必要ですが。)

以上、SQLServerで一時的に外部キー制約を無効にする方法でした。

タイトルとURLをコピーしました