SQLite 制約

制約は、テーブルのデータ列に強制されるルールです。これらはテーブルに挿入できるデータ型を制限するために使用され、データベース内のデータの正確性と信頼性を保証します。

制約は列レベルまたはテーブルレベルにできます。列レベル制約は列にのみ適用され、テーブルレベル制約はテーブル全体に適用されます。

以下は SQLite でよく使用される制約です。

  • NOT NULL 制約:列に NULL 値を許可しないことを保証します。

  • DEFAULT 制約:列に値が指定されていない場合、その列にデフォルト値を提供します。

  • UNIQUE 制約:列内のすべての値が異なることを保証します。

  • PRIMARY KEY 制約:データベーステーブルの各行/レコードを一意に識別します。

  • CHECK 制約:CHECK 制約は、列内のすべての値が特定の条件を満たすことを保証します。

NOT NULL 制約

デフォルトでは、列は NULL 値を保持できます。列に NULL 値を持たせたくない場合は、その列にこの制約を定義し、その列で NULL 値を許可しないように指定する必要があります。

NULL はデータがないこととは異なり、未知のデータを表します。

例

たとえば、次の SQLite ステートメントは新しいテーブル COMPANY を作成し、5つの列を追加します。そのうち ID、NAME、AGE の3列は NULL 値を受け付けないように指定されています。

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

DEFAULT 制約

DEFAULT 制約は、INSERT INTO ステートメントが特定の値を提供しない場合に、列にデフォルト値を提供します。

例

たとえば、次の SQLite ステートメントは新しいテーブル COMPANY を作成し、5つの列を追加します。ここでは、SALARY 列はデフォルトで 5000.00 に設定されています。そのため、INSERT INTO ステートメントがこの列に値を提供しない場合、この列は 5000.00 に設定されます。

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

UNIQUE 制約

UNIQUE 制約は、特定の列に同じ値を持つ2つのレコードが存在することを防ぎます。たとえば、COMPANY テーブルでは、2人以上が同じ年齢になることを防ぎたい場合があります。

例

たとえば、次の SQLite ステートメントは新しいテーブル COMPANY を作成し、5つの列を追加します。ここでは、AGE 列が UNIQUE に設定されているため、同じ年齢のレコードが2つ存在することはできません。

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL UNIQUE,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

PRIMARY KEY 制約

PRIMARY KEY 制約は、データベーステーブル内の各レコードを一意に識別します。1つのテーブルには複数の UNIQUE 列を設定できますが、主キーは1つだけです。データベーステーブルを設計する際、主キーは非常に重要です。主キーは一意の ID です。

主キーを使用してテーブルの行を参照します。主キーを他のテーブルの外部キーに設定することで、テーブル間の関係を作成できます。「長年にわたるコーディング上の見落とし」により、SQLite では主キーを NULL にすることができます。これは他のデータベースと異なる点です。

主キーはテーブル内のフィールドで、データベーステーブルの各行/レコードを一意に識別します。主キーは一意の値を含む必要があります。主キー列は NULL 値を持つことはできません。

1つのテーブルには主キーを1つだけ設定でき、1つまたは複数のフィールドで構成できます。複数のフィールドが主キーとして使用される場合、それらは複合キー。

テーブルが任意のフィールドに主キーを定義している場合、それらのフィールドに同じ値を持つ2つのレコードが存在することはできません。

例

ID を主キーとする COMAPNY テーブルを作成するさまざまな例をすでに見てきました。

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

CHECK 制約

CHECK 制約は、レコードを入力する際に値をチェックする条件を有効にします。条件の値が false の場合、レコードは制約に違反し、テーブルに入力できません。

例

たとえば、次の SQLite ステートメントは新しいテーブル COMPANY を作成し、5つの列を追加します。ここでは、SALARY 列に CHECK を追加しているため、給与をゼロにすることはできません。

CREATE TABLE COMPANY3(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    CHECK(SALARY > 0)
);

制約の削除

SQLite でテーブルの制約を削除するには、通常、次を使用する必要がありますALTER TABLEステートメントを使用し、削除する制約の種類を指定します。

主キー制約の削除:

ALTER TABLE table_name
DROP CONSTRAINT primary_key_name;

ここで、table_nameは操作するテーブル名、primary_key_nameは削除する主キー制約の名前です。

一意制約の削除:

ALTER TABLE table_name
DROP CONSTRAINT unique_constraint_name;

同様に、table_nameはテーブル名、unique_constraint_nameは削除する一意制約の名前です。

外部キー制約の削除:

ALTER TABLE table_name
DROP CONSTRAINT foreign_key_constraint_name;

ここで、table_nameはテーブル名、foreign_key_constraint_nameは削除する外部キー制約の名前です。

その他の拡張