sql >> データベース >  >> RDS >> Sqlserver

SQL Server(T-SQL)の既存のテーブルにCHECK制約を追加する

    この記事では、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 、または画像 列。

    1. 覚えやすい9つの本当に便利なMySQL日付関数

    2. MariaDBでデータベース照合を取得する4つの方法

    3. Moodle3.9でデータベーストラフィックの読み取り/書き込み分割を使用してパフォーマンスを向上させる

    4. MariaDBでのCHAR_LENGTH()のしくみ