この記事では、CHECK
を追加する方法を示します 既存のテーブルへの制約。
ALTER TABLE
を使用して、既存のテーブルに制約を追加できます。 ADD CONSTRAINT
とともにステートメント 口論。以下の例。
例1-テーブルを作成する
まず、CHECK
を追加するテーブルを作成しましょう。 制約。
CREATE TABLE Event ( EventId int IDENTITY(1,1) NOT NULL PRIMARY KEY, EventName varchar(255) NOT NULL, StartDate date NOT NULL, EndDate date NOT NULL, Price smallmoney NOT NULL );
例2–列レベルの制約を追加する
次に、CHECK
を追加しましょう
Price
への制約 列。
ALTER TABLE Event ADD CONSTRAINT chkPrice CHECK (Price > 0);
この制約により、価格は常にゼロより大きくなります。
制約が追加されたので、無効なデータを挿入しようとするとどうなりますか。
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );
結果:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "EMS", table "dbo.Event", column 'Price'.
この場合、CHECK
制約は、Price
内のすべてのデータを指定します 列は0より大きくする必要があります。つまり、価格をゼロにすることも、負にすることもできません。
これは、列レベルの制約と呼ばれます。 、単一の列で定義されているためです。 1列のデータに適用されます。
例3–テーブルレベルの制約を追加する
次に、テーブルレベルのCHECK
を追加しましょう 制約。これにより、2列のデータがチェックされます。
ALTER TABLE Event ADD CONSTRAINT chkEndDate CHECK (EndDate >= StartDate);
この場合、終了日が開始日より前になることがないように制約を追加します。これは2つの列にまたがるデータをチェックしているため、テーブルレベルの制約です。
無効な値を挿入してみてください:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );
結果:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkEndDate". The conflict occurred in database "EMS", table "dbo.Event".
予想どおり、終了日が開始日よりも早いため、操作は失敗します。
この制約をテストするには、前の制約が最初にトリガーされないように、価格を有効な値に上げる必要があることに注意してください(CHECK
制約は、作成された順序で検証されます。
例4–制約に準拠したデータを正常に挿入する
行を正常に挿入するには、有効な値を挿入していることを確認するだけです。
例:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 ); SELECT * FROM Event;
結果:
+-----------+-------------+-------------+------------+----------+ | EventId | EventName | StartDate | EndDate | Price | |-----------+-------------+-------------+------------+----------| | 4 | ICCC 2020 | 2020-01-01 | 2020-02-02 | 150.0000 | +-----------+-------------+-------------+------------+----------+
EventId
に注意してください 列はすでに4にインクリメントされています。これはIDENTITY
であるためです。 桁。 IDENTITY
について覚えておくべき重要なこと 列は、制約によってINSERT
が発生した場合でもインクリメントされます。 失敗する操作。
CHECK制約のいくつかの制限
CHECK
を使用する際に注意すべきいくつかの制限があります 制約:
- 検索条件はブール式に評価される必要があり、別のテーブルを参照することはできません。
- 式にエイリアスデータ型を含めることはできません。
CHECK
テキストに制約を定義することはできません 、 ntext 、または画像 列。