SQLiteを学んでいこうという連載の12回目です。前回の記事はこちらになります。
前回は、SQLiteでテーブル操作の基本についてご紹介しました。
一般的なデータベース管理システムには制約という機能があります。テーブルの列に設定されるデータに制限を設けることができます。今回はSQLiteの制約機能について学んでいこうと思います。
制約とは
データベース内のデータは常に正確な(整合性が維持されている)状態でなければなりません。デーベース管理システムには、この整合性を保つためにテーブルの列ごとに入力可能なデータのルールを決めることができます。入力されたデータがこのルールを守っていない場合、データベース管理システムはデータの登録を拒否します。この機能の事を制約と呼びます。SQLiteで設定できる制約について見ていきましょう。
NOT NULL制約
NULLとはデータが何も入っていない状態の事です。データベースではNULLのままの状態はあまり好ましくないとされています。テーブルの列にNOT NULL制約を設定すると、設定された列をNULLのままデータを登録できなくなります。NOT NULL制約はテーブル作成時に以下の指定をすると設定できます。
CREATE TABLE テーブル名(列名 データ型 NOT NULL);
それではNOT NULL制約を設定してテーブルを作って動きを見てみましょう。
sqlite> CREATE TABLE sample(id INTEGER,name TEXT NOT NULL,age INTEGER); sqlite> INSERT INTO sample VALUES(1,"TANAKA",25); sqlite> INSERT INTO sample VALUES(2,NULL,30); Runtime error: NOT NULL constraint failed: sample.name (19)
最初のデータは登録できましたが2番目はエラーメッセージが出ました。name列がNULLとなっているからです。テーブルの内容を見てみると
sqlite> SELECT * FROM sample; ┌────┬──────────┬─────┐ │ id │ name │ age │ ├────┼──────────┼─────┤ │ 1 │ 'TANAKA' │ 25 │ └────┴──────────┴─────┘
最初のデータだけが登録されています。
UNIQUE制約
UNIQUEとは同じデータが複数存在していないということです。一意とも言います。同じデータが複数存在してはいけない列にはUNIQUE制約を設定します。UNIQUE制約はテーブル作成時に以下の指定をすると設定できます。
CREATE TABLE テーブル名(列名 データ型 UNIQUE);
UNIQUE制約を設定してテーブルを作って動きを見てみましょう。
sqlite> CREATE TABLE sample(id INTEGER,name TEXT UNIQUE,age INTEGER); sqlite> INSERT INTO sample VALUES(1,"TANAKA",25); sqlite> INSERT INTO sample VALUES(2,"TANAKA",30); Runtime error: UNIQUE constraint failed: sample.name (19)
最初のデータと2番目のデータのname列が同じ「TANAKA」となっているため、2番目のデータは登録できません。
DEFAULT制約
DEFAULT制約を設定すると、その列のデータ入力を省略するとDEFAULT制約で指定した値が設定されます。DEFAULT制約はテーブル作成時に以下の指定をすると設定できます。
CREATE TABLE テーブル名(列名 データ型 DEFAULT 設定値);
DEFAULT制約を設定してテーブルを作って動きを見てみましょう。指定した列のみデータを入力する場合(指定外の列は省略)は以下の様に記述します。
INSERT INTO テーブル名(列名1,列名2,列名3・・・) VALUES(値1,値2,値3・・・);
sqlite> CREATE TABLE sample(id INTEGER,name TEXT DEFAULT "NO NAME",age INTEGER); sqlite> INSERT INTO sample VALUES(1,"TANAKA",25); sqlite> INSERT INTO sample(id,age) VALUES(2,30); sqlite> SELECT * FROM sample; ┌────┬───────────┬─────┐ │ id │ name │ age │ ├────┼───────────┼─────┤ │ 1 │ 'TANAKA' │ 25 │ │ 2 │ 'NO NAME' │ 30 │ └────┴───────────┴─────┘
name列を省略すると「NO NAME」となりました。
CHECK制約
CHECK制約を設定すると、条件を指定して条件が満たしているデータのみを入力できるようになります。CHECK制約はテーブル作成時に以下の指定をすると設定できます。
CREATE TABLE テーブル名(列名 データ型 CHECK(条件式));
CHECK制約を設定してテーブルを作って動きを見てみましょう。age列が20以上のデータを有効としてみます。
sqlite> CREATE TABLE sample(id INTEGER,name TEXT ,age INTEGER CHECK(age >= 20)); sqlite> INSERT INTO sample VALUES(1,"TANAKA",25); sqlite> INSERT INTO sample VALUES(2,"YAMADA",19); Runtime error: CHECK constraint failed: age >= 20 (19) sqlite> SELECT * FROM sample; ┌────┬──────────┬─────┐ │ id │ name │ age │ ├────┼──────────┼─────┤ │ 1 │ 'TANAKA' │ 25 │ └────┴──────────┴─────┘
1番目のデータだけが登録され、2番目はエラーとなりました。
次回も制約
いかがでしょうか。制約機能を使用することによってデータベース内のデータ整合性が上がります。SQLiteには他にも制約機能があります。次回はそれらを見ていきましょう。お楽しみに!!