Share via


CHECK 制約の作成と変更

CHECK 制約は、テーブルを作成するときに、テーブルの定義の一部として作成できます。テーブルが既に存在する場合、CHECK 制約を追加できます。テーブルおよび列には複数の CHECK 制約を格納できます。

既存の CHECK 制約を変更または削除することもできます。たとえば、テーブル内の列の CHECK 制約で使用する式を変更できます。

注意

CHECK 制約を変更するには、最初に既存の CHECK 制約を削除してから、新しい定義を使用して再作成する必要があります。

次の Transact-SQL の例では新しいテーブルを作成してから、CHECK 制約を CreditRating 列に追加することによってそのテーブルを変更します。

IF OBJECT_ID ('dbo.Vendors', 'U') IS NOT NULL
DROP TABLE dbo.Vendors;
GO
CREATE TABLE dbo.Vendors 
    (VendorID int PRIMARY KEY, VendorName nvarchar (50), 
    CreditRating tinyint)
GO
ALTER TABLE dbo.Vendors ADD CONSTRAINT CK_Vendor_CreditRating
    CHECK (CreditRating >= 1 AND CreditRating <= 5)

制約式に含まれる列内の許容データ値に対する制限を除去するには、CHECK 制約を削除してください。

テーブルの作成時に CHECK 制約を作成するには

既存のテーブルに CHECK 制約を作成するには

CHECK 制約を削除するには

WITH NOCHECK を使用した CHECK 制約の強制

既存のテーブルに CHECK 制約を追加するとき、CHECK 制約は新しいテーブルのみに適用することも、既存のデータに適用することもできます。既定では、既存のデータと新しいデータの両方に CHECK 制約が適用されます。新しい制約を新しく追加するデータにのみ適用するには、ALTER TABLE ステートメントの WITH NOCHECK オプションを使用します。既存のデータが新しい CHECK 制約を既に満たしている場合、または特定の時点以降のみに制約を強制することがビジネス ルールによって定められている場合に、このオプションを使用すると便利です。

たとえば、古い制約では郵便番号が 5 桁である必要があったのが、新しい制約では 9 桁である必要があるとします。郵便番号が 5 桁である古いデータは引き続き有効であり、郵便番号が 9 桁である新しいデータと共存させます。したがって、新しいデータが新しい制約を満たしているかのみをチェックすればよいことになります。

ただし、既存のデータをチェックせずに制約を追加すると、データベース エンジンによるテーブルの整合性ルールを適用するための制御がバイパスされるので、注意する必要があります。

CHECK 制約を作成するときに既存のデータをチェックしないようにするには

CHECK 制約の無効化

INSERT 操作、UPDATE 操作、レプリケーション処理などの特定の操作に対して、既存の CHECK 制約を無効化することができます。

  • INSERT ステートメントと UPDATE ステートメント

    CHECK 制約を無効にすると、その制約による検証を行わずにテーブル内のデータを変更できるようになります。新しいデータが制約に違反する場合、またはデータベース内の既存のデータのみに制約を適用する場合は、INSERT ステートメントおよび UPDATE ステートメントを実行する間、CHECK 制約を無効にしてください。

  • レプリケーション処理

    制約がソース データベースに固有である場合、レプリケーション処理中は CHECK 制約を無効にしてください。テーブルをレプリケートすると、テーブルの定義およびデータが、ソース データベースからレプリケーション先のデータベースにコピーされます。ソース データベースとレプリケーション先のデータベースは同じサーバーにあることもありますが、通常は別々のサーバーにあります。CHECK 制約がソース データベースに固有であり無効になっていない場合は、レプリケーション先のデータベースに新しいデータが入力されないおそれがあります。詳細については、「NOT FOR REPLICATION を使用した制約、ID、およびトリガの制御」を参照してください。

INSERT ステートメントおよび UPDATE ステートメントの実行中に CHECK 制約を無効にするには

レプリケーション処理中に CHECK 制約を無効にするには

CHECK 制約に関する情報を取得するには

関連項目

概念