SQLite の主キーと外部キーと例

SQLiteの制約

列制約は、挿入されたデータを検証するために、列に挿入された値に制約とルールを適用します。 列制約は、テーブルの作成時に列定義で定義されます。

SQLiteの主キー

主キー列のすべての値は一意である必要があり、null であってはなりません

主キーは XNUMX つの列のみに適用することも、複数の列の組み合わせに適用することもできます。後者の場合、列の値の組み合わせはすべてのテーブルの行で一意である必要があります。

構文:

テーブルに主キーを定義するには、次のようなさまざまな方法があります。

  • 列定義自体では次のようになります。
    ColumnName INTEGER NOT NULL PRIMARY KEY;
  • 別の定義として:
    PRIMARY KEY(ColumnName);
  • 列の組み合わせを主キーとして作成するには:
    PRIMARY KEY(ColumnName1, ColumnName2);

NULL でない制約

SQLite Not null 制約は、列が null 値を持つことを防ぎます。

ColumnName INTEGER  NOT NULL;

デフォルトの制約

SQLite のデフォルト制約 列に値を挿入しない場合、代わりにデフォルト値が挿入されます。

例:

ColumnName INTEGER DEFAULT 0;

insert ステートメントを作成し、その列に値を指定しなかった場合、その列の値は 0 になります。

SQLiteの一意制約

SQLiteの一意の制約により、列のすべての値の間で値が重複するのを防ぎます。

例:

EmployeeId INTEGER NOT NULL UNIQUE;

これにより、 "従業員ID" 値は一意である必要があり、重複した値は許可されません。 これは列の値に適用されることに注意してください。 "従業員ID" のみ。

SQLite CHECK 制約

SQLite チェックでは、挿入された値をチェックする条件を制約します。値が条件に一致しない場合、値は挿入されません。

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

10 未満の値を挿入することはできません。 "量" コラム。

SQLite外部キー

SQLite 外部キーは、あるテーブルに存在する値の存在を、外部キーが定義されている最初のテーブルと関係がある別のテーブルに対して検証する制約です。

複数のテーブルを操作しているときに、XNUMX つの列を共有して相互に関連する XNUMX つのテーブルがある場合。 また、一方に挿入された値がもう一方のテーブルの列に必ず存在するようにしたい場合は、その列に共通の「外部キー制約」を使用する必要があります。

この場合、その列に値を挿入しようとすると、外部キーによって、挿入された値がテーブルの列に存在することが保証されます。

外部キー制約はデフォルトでは有効になっていないことに注意してください。 SQLiteの、最初に次のコマンドを実行して有効にする必要があります。wing コマンド:

PRAGMA foreign_keys = ON;

外部キー制約は、バージョン 3.6.19 以降の SQLite に導入されました。

SQLite 外部キーの例

XNUMX つのテーブルがあると仮定します。 学生と学部。

Student テーブルには学生のリストがあり、Departments テーブルには学部のリストがあります。 各学生はそれぞれの学科に所属しています。 つまり、各学生には、DepartmentId 列があります。

ここで、students テーブルの学部 ID の値が学部テーブルに必ず存在するようにするために、外部キー制約がどのように役立つかを見ていきます。

SQLite外部キー

したがって、Students テーブルのDepartmentId に外部キー制約を作成した場合、挿入された各DepartmentId はDepartments テーブルに存在する必要があります。

CREATE TABLE [Departments] (
	[DepartmentId] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
	[DepartmentName] NVARCHAR(50)  NULL
);
CREATE TABLE [Students] (
	[StudentId] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
	[StudentName] NVARCHAR(50)  NULL,
	[DepartmentId] INTEGER  NOT NULL,
	[DateOfBirth] DATE  NULL,
	FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId)
);

外部キー制約によって、別のテーブルとのリレーションがあるテーブルに未定義の要素または値が挿入されるのをどのように防ぐことができるかを確認するには、次のことを調べます。wing 例。

この例では、Departments テーブルには Students テーブルに対する外部キー制約があるため、students テーブルに挿入されるデパートメント ID 値はすべて、Departments テーブルに存在する必要があります。 部門テーブルに存在しない部門 ID 値を挿入しようとすると、外部キー制約により挿入できなくなります。

XNUMX つの部門を挿入しましょう "それ" > "芸術" 次のように部門テーブルに追加しますwing:

INSERT INTO Departments VALUES(1, 'IT');
INSERT INTO Departments VALUES(2, 'Arts');

XNUMX つのステートメントは XNUMX つの部門を部門テーブルに挿入する必要があります。クエリを実行すると、XNUMX つの値が挿入されたことを確認できます。 「部門から * を選択」 その後:

SQLite外部キー

次に、学部のテーブルに存在しない学部 ID を持つ新しい学生を挿入してみます。

INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);

行は挿入されず、次のようなエラーが表示されます。 FOREIGN KEY 制約が失敗しました。