概要 :このチュートリアルでは、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
の使用方法を学びました。 列または列のグループの値が式で定義された条件を満たすことを保証するための制約。