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

SQLiteでチェック制約を有効/無効にする方法

    すべてのCHECKを有効または無効にする必要がある場合 SQLiteの制約では、 ignore_check_constraintsを使用できます PRAGMAステートメント。

    このプラグマステートメントは、 CHECKの強制を明示的に有効または無効にします 制約。デフォルト設定はオフです。つまり、 CHECK 制約はデフォルトで適用されます。

    構文

    構文は次のようになります:

    PRAGMA ignore_check_constraints = boolean;

    ブール値の場所 ブール値です。

    • CHECKを無効にするには 制約。これは次のいずれかになります。
      • false
      • いいえ
      • オフ
      • 0
    • CHECKを有効にするには 制約、これは次のいずれかになります:
      • true
      • はい
      • オン
      • 1

    まず、 CHECKを使用してテーブルを作成しましょう 制約:

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

    これで、 CHECKを切り替えることができます 必要に応じて制約をオンまたはオフにして、その制約を適用するかどうかを決定します。

    チェック制約を有効にする

    すべてのCHECKを有効にする例を次に示します。 制約:

    PRAGMA ignore_check_constraints = 0;

    前述のように、これはとにかくデフォルト値です。したがって、このPRAGMAステートメントを使用しない場合は CHECK 制約はすでにこの値に設定されています。

    それでは、その CHECKをテストしてみましょう。 制約は、実際には、その CHECKに違反するデータを挿入しようとすることで有効になります。 制約:

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

    結果:

    Error: CHECK constraint failed: Products

    したがって、 CHECK 期待どおりに制約が適用されました。

    チェック制約を無効にする

    すべてのCHECKを無効にする例を次に示します。 制約:

    PRAGMA ignore_check_constraints = 1;

    次に、同じデータをもう一度挿入して、結果を選択してみましょう。

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

    結果:

    ProductId   ProductName  Price     
    ----------  -----------  ----------
    1           Blue Widget  0.0       

    予想どおり、データは CHECK に違反していても、なんとかデータベースに入ることができました。 制約。


    1. 挿入SQLServerでif条件を使用する

    2. SQL:NOTINとNOTEQUAL TOに関しては、どちらがより効率的で、なぜですか?

    3. Oracle 10gは、日付で5桁の年を受け入れます

    4. 条項間のMySQLは包括的ではありませんか?