一括インポート操作による制約チェックの制御

更新 : 2006 年 12 月 12 日

データを一括インポートするときは、一括インポート操作によって CHECK 制約および FOREIGN KEY 制約を適用するかどうかを制御できます。制約とは、列の有効な値を定義するために列に適用されるビジネス ルールのことです。たとえば、電話の内線番号を含んでいる列の制約には、#### という形式が必要となる場合があります。制約の定義とチェックは、データの整合性を設定するための標準的なメカニズムです。通常、制約チェックは増分一括インポートの際に使用してください。

制約を無視することが必要な場合があります。たとえば、制約に違反する行が入力データに含まれている場合などです。制約を無視することによって、データを読み込んだ後に、Transact-SQL のステートメントを使用してデータをクリーンアップできます。

一括インポート操作の前にテーブルが空白になっていない場合、制約の再検証にかかるコストは、CHECK 制約および FOREIGN KEY 制約を増分データに適用することによるコストを上回る可能性があります。問題のあるデータをインポートした後は、Transact-SQL を使用して、インポートしたデータをクリーンアップする必要があります。

ms186247.note(ja-jp,SQL.90).gif重要 :
制約が無効になっていると、メタデータを更新するためにスキーマ変更ロックが取得される場合があります。これにより、他のコマンド (オンラインのインデックス構築など) またはトランザクションとの競合が生じる可能性があります。たとえば、ターゲット テーブルにアクセスするスナップショット分離トランザクションは、DDL の同時変更が原因で失敗することがあります。

制約の詳細については、「制約」を参照してください。

一括インポート操作中の制約チェックの動作は、どのコマンドを操作に使用するかによって決まります。bcp コマンドと BULK INSERT ステートメントでは、制約は既定で無視されます。これに対して、INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメントでは、制約は既定でチェックされます。

次の表は、一括インポート コマンドの既定の制約チェック動作を示しています。

コマンド 既定の動作

bcp

制約を無視

BULK INSERT

制約を無視

INSERT ...SELECT * FROM OPENROWSET(BULK...)

制約をチェック

各一括インポート コマンドには、制約の処理方法を変更するための修飾子が用意されています。これについては、次のセクションで説明します。

bcp または BULK INSERT を使用した制約のチェック

bcp コマンドまたは BULK INSERT ステートメントによって実行される一括インポート操作では、制約は既定で無視されます。

bcp コマンドと BULK INSERT ステートメントを使用すると、一括インポート操作中に制約を適用するように指定することができます。制約を適用すると、一括インポート操作は遅くなりますが、挿入されたすべてのデータが確実に既存の制約に従うようになります。次の表は、一括インポート操作で制約の適用を指定するために使用できる修飾子を示しています。

コマンド 修飾子 修飾子の種類

bcp

-h"CHECK_CONSTRAINTS"

ヒント

BULK INSERT

CHECK_CONSTRAINTS

引数

詳細については、「bcp ユーティリティ」および「BULK INSERT (Transact-SQL)」を参照してください。

INSERT ... SELECT * FROM OPENROWSET(BULK...) における制約の無視

既定では、INSERT によって CHECK 制約および FOREIGN KEY 制約がチェックされます。ただし、INSERT ...SELECT * FROM OPENROWSET(BULK...) ステートメントを使用すると、CHECK 制約および FOREIGN KEY 制約のチェックを上書きできます。

ms186247.note(ja-jp,SQL.90).gifメモ :
UNIQUE、PRIMARY KEY、または NOT NULL の各制約を無効にすることはできません。

次の表は、CHECK 制約および FOREIGN KEY 制約を無視するためのテーブル ヒントを示しています。

コマンド 修飾子 修飾子の種類

INSERT ...SELECT * FROM OPENROWSET(BULK...)

WITH (IGNORE_CONSTRAINTS)

テーブル ヒント

次の例は、この修飾子の使用方法を示しています。IGNORE_CONSTRAINTS ヒントの詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。

データがインポートされたことの確認

一括インポート操作中に制約を無視すると、既存の制約に違反するデータをテーブルに挿入できます。そのため、テーブルの無視された各制約は、sys.check_constraints カタログ ビューまたは sys.foreign_keys カタログ ビューで is_not_trusted に設定されています。いずれかの段階で、テーブル全体の制約を確認する必要があります。

制約条件をテストする Transact-SQL クエリまたはストアド プロシージャを使用して、インポートしたデータを手動でチェックすることにより、制約に違反しているインポートしたテーブル行を特定できます。

参照

その他の技術情報

bcp ユーティリティ
BULK INSERT (Transact-SQL)
DBCC CHECKCONSTRAINTS (Transact-SQL)
INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
SELECT (Transact-SQL)
テーブル ヒント (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

変更内容 :
  • CHECK 制約と FOREIGN KEY 制約が共に制御されることを示すようにトピックを修正しました。