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

SQLiteでチェック制約を作成する

    SQLiteでは、CHECKを作成できます CREATE TABLE内に該当するコードを追加することによる制約 テーブルを作成するときのステートメント。

    テーブルにCHECKがある場合 制約があり、CHECKに違反するデータを挿入または更新しようとしました 制約がある場合、操作はエラーで失敗します。

    列レベルのチェック制約

    列レベルのCHECKを作成する例を次に示します。 制約。

    CREATE TABLE Products( 
        ProductId INTEGER PRIMARY KEY, 
        ProductName, 
        Price 
        CHECK (Price > 0)
    );

    CHECK (Price > 0)に進む部分 CHECKです 制約。

    この場合、価格はゼロより大きくなければならないことを指定します。

    次に、この制約に違反するデータを挿入しようとするとどうなるか見てみましょう。

    INSERT INTO Products VALUES 
        (NULL, 'Blue Widget', 0.00);

    結果:

    Error: CHECK constraint failed: Products

    CHECK 制約は期待どおりに機能しました。

    負の値を使用しようとしても同じ結果が得られます。

    INSERT INTO Products VALUES 
        (NULL, 'Blue Widget', -1.00);

    結果:

    Error: CHECK constraint failed: Products

    ただし、ゼロより大きい値に増やすと、INSERT 操作は成功します。

    INSERT INTO Products VALUES 
        (NULL, 'Blue Widget', 1.00);
    
    SELECT * FROM Products;

    結果:

    ProductId   ProductName  Price     
    ----------  -----------  ----------
    1           Blue Widget  1.0       

    テーブルレベルのチェック制約

    テーブルレベルのCHECK 制約は、単一の列だけでなく、行全体にわたってデータをチェックします。つまり、テーブルレベルの制約を使用して、複数の列のデータをチェックできます。

    これは、テーブルレベルのCHECKの例です。 制約。

    CREATE TABLE Products( 
        ProductId INTEGER PRIMARY KEY, 
        ProductName, 
        Price,
        Discount,
        CHECK (Price >= Discount)
    );

    この表は最初の表と似ていますが、割引という列を追加した点が異なります。 。

    CHECKの場合 制約として、価格が割引よりも大きいことを確認しています(実際の価格よりも大きい割引が発生する可能性はありません)。

    価格よりも大きい割引を挿入しようとすると、次のようになります。

    INSERT INTO Products VALUES 
        (NULL, 'Blue Widget', 1.00, 2.00);

    結果:

    Error: CHECK constraint failed: Products

    価格より低くなるように割引を調整すると、正常に挿入されます。

    INSERT INTO Products VALUES 
        (NULL, 'Blue Widget', 1.00, 0.50);
    
    SELECT * FROM Products;

    結果:

    ProductId   ProductName  Price       Discount  
    ----------  -----------  ----------  ----------
    1           Blue Widget  1.0         0.5       

    1. MariaDB JSON_OBJECT()の説明

    2. SpringBootテスト用のEmbeddedPostgres

    3. Spring Batch ORA-08177:単一のジョブを実行している場合、このトランザクションへのアクセスをシリアル化できません、SERIALIZED分離レベル

    4. Rubygemmysql2のインストールに失敗する