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

SQLiteCHECK制約

    概要 :このチュートリアルでは、SQLite CHECKの使用方法を学習します 挿入または更新する前にデータを検証するための制約。

    SQLite CHECKの紹介 制約

    SQLite CHECK 制約を使用すると、値が列に挿入または更新されるたびに、値をテストするための式を定義できます。

    値が式で定義された基準を満たさない場合、SQLiteは制約違反を発行し、ステートメントを中止します。

    CHECK 制約を使用すると、UNIQUE以外の追加のデータ整合性チェックを定義できます。 またはNOT NULL 特定のアプリケーションに合わせて。

    SQLiteでは、CHECKを定義できます 列レベルまたはテーブルレベルでの制約。

    次のステートメントは、CHECKを定義する方法を示しています。 列レベルでの制約:

    CREATE TABLE table_name(
        ...,
        column_name data_type CHECK(expression),
        ...
    );
    Code language: SQL (Structured Query Language) (sql)

    次のステートメントは、CHECKを定義する方法を示しています。 テーブルレベルでの制約:

    CREATE TABLE table_name(
        ...,
        CHECK(expression)
    );
    Code language: SQL (Structured Query Language) (sql)

    この構文では、行がテーブルに挿入されるか、既存の行が更新されるたびに、各CHECKに関連付けられた式が使用されます。 制約が評価され、数値0または1が返されます。

    結果がゼロの場合、制約違反が発生しました。結果がゼロ以外の値またはNULLの場合は、制約違反が発生していないことを意味します。

    CHECKの式に注意してください 制約にサブクエリを含めることはできません。

    SQLite CHECK 制約の例

    CHECKの使用例をいくつか見てみましょう。 制約。

    1)SQLiteの使用CHECK 列レベルの例での制約

    次のステートメントは、contactsという名前の新しいテーブルを作成します :

    CREATE TABLE contacts (
        contact_id INTEGER PRIMARY KEY,
        first_name TEXT    NOT NULL,
        last_name  TEXT    NOT NULL,
        email      TEXT,
        phone      TEXT    NOT NULL
                        CHECK (length(phone) >= 10) 
    );
    Code language: SQL (Structured Query Language) (sql)

    contacts テーブル、phone 列にCHECKがあります 制約:

    CHECK (length(phone) >= 10) 
    Code language: SQL (Structured Query Language) (sql)

    このCHECK 制約により、phoneの値が保証されます 列は10文字以上である必要があります。

    次のステートメントを実行しようとすると、制約違反エラーが発生します。

    INSERT INTO contacts(first_name, last_name, phone)
    VALUES('John','Doe','408123456');Code language: SQL (Structured Query Language) (sql)

    エラーメッセージは次のとおりです。

    Result: CHECK constraint failed: contacts
    Code language: SQL (Structured Query Language) (sql)

    その理由は、挿入しようとした電話番号が9文字であるのに対し、少なくとも10文字必要であるためです。

    phoneの値は、次のステートメントで機能するはずです。 列は13文字で、CHECKの式を満たします。 制約:

    INSERT INTO contacts(first_name, last_name, phone)
    VALUES('John','Doe','(408)-123-456');Code language: SQL (Structured Query Language) (sql)

    2)SQLiteの使用CHECK テーブルレベルの例での制約

    次のステートメントは、productsという名前の新しいテーブルを作成します :

    CREATE TABLE products (
        product_id   INTEGER         PRIMARY KEY,
        product_name TEXT            NOT NULL,
        list_price   DECIMAL (10, 2) NOT NULL,
        discount     DECIMAL (10, 2) NOT NULL
                                    DEFAULT 0,
        CHECK (list_price >= discount AND 
            discount >= 0 AND 
            list_price >= 0) 
    );
    Code language: SQL (Structured Query Language) (sql)

    この例では、CHECK 制約はテーブルレベルで定義されます:

    CHECK (list_price >= discount AND 
                discount >= 0 AND 
                list_price >= 0) Code language: SQL (Structured Query Language) (sql)

    CHECK 制約により、定価は常に割引以上であり、割引と定価の両方がゼロ以上であることが保証されます。

    次のステートメントはCHECKに違反しています 割引が定価よりも高いため、制約があります。

    INSERT INTO products(product_name, list_price, discount)
    VALUES('New Product',900,1000);    Code language: SQL (Structured Query Language) (sql)

    次のステートメントもCHECKに違反しています 割引がマイナスであるための制約:

    INSERT INTO products(product_name, list_price, discount)
    VALUES('New XFactor',1000,-10);    Code language: SQL (Structured Query Language) (sql)

    CHECKの追加 既存のテーブルへの制約

    バージョン3.25.2以降、SQLiteはCHECKの追加をサポートしていません 既存のテーブルへの制約。

    ただし、次の手順に従うことができます。

    まず、CHECKを追加するテーブルと同じ構造の新しいテーブルを作成します。 制約。新しいテーブルには、CHECKも含める必要があります 制約:

    CREATE TABLE new_table (
        [...],
        CHECK ([...])
    );
    Code language: SQL (Structured Query Language) (sql)

    古いテーブルの構造を取得するには、.schemaを使用できます。 指図。詳細については、SQLiteDESCRIBEテーブルのチュートリアルをご覧ください。

    次に、古いテーブルから新しいテーブルにデータをコピーします。

    INSERT INTO new_table SELECT * FROM old_table;Code language: SQL (Structured Query Language) (sql)

    第三に、古いテーブルを削除します:

    DROP TABLE old_table;Code language: SQL (Structured Query Language) (sql)

    第4に、新しいテーブルの名前を古いテーブルに変更します。

    ALTER TABLE new_table RENAME TO old_table;Code language: SQL (Structured Query Language) (sql)

    上記のすべてのステートメントをトランザクションセーフにするには、次のようなトランザクション内ですべてのステートメントを実行する必要があります。

    BEGIN;
    -- create a new table 
    CREATE TABLE new_table (
        [...],
        CHECK ([...])
    );
    -- copy data from old table to the new one
    INSERT INTO new_table SELECT * FROM old_table;
    
    -- drop the old table
    DROP TABLE old_table;
    
    -- rename new table to the old one
    ALTER TABLE new_table RENAME TO old_table;
    
    -- commit changes
    COMMIT;
    Code language: SQL (Structured Query Language) (sql)

    このチュートリアルでは、SQLiteのCHECKの使用方法を学びました。 列または列のグループの値が式で定義された条件を満たすことを保証するための制約。


    1. PHPを使用してMySQLデータベースに保存するIPアドレス

    2. sqliteDBからテーブル名を一覧表示する方法-Android

    3. pg_escape_stringは正確に何をしますか?

    4. JOINのON句で参照されるテーブルの順序は重要ですか?