制約_1(SQLiteを学ぶ_12)

SQLiteを学んでいこうという連載の12回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、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には他にも制約機能があります。次回はそれらを見ていきましょう。お楽しみに!!

hirocom777.hatenadiary.org

SQLite学習記事のまとめですはこちらから