SQLite 制約管理 (SQLite Constraint Management)

SQLiteSQLiteBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに (Introduction)

この実験 (lab) では、データ整合性を確保するために、SQLite の制約管理について学びます。まず、外部キー制約を定義してテーブル間の関係を確立し、CHECK 制約を実装し、複合キーを作成します。最後に、制約違反をテストして、SQLite がこれらのルールをどのように適用するかを理解します。この実践的な経験を通して、SQLite データベース内でデータの整合性を維持する方法を実践的に理解することができます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sqlite(("SQLite")) -.-> sqlite/SQLiteGroup(["SQLite"]) sqlite/SQLiteGroup -.-> sqlite/make_table("Create New Table") sqlite/SQLiteGroup -.-> sqlite/add_row("Insert Single Row") sqlite/SQLiteGroup -.-> sqlite/add_rows("Insert Multiple Rows") sqlite/SQLiteGroup -.-> sqlite/query_where("Filter With WHERE") sqlite/SQLiteGroup -.-> sqlite/verify_table("Check Table Existence") subgraph Lab Skills sqlite/make_table -.-> lab-552545{{"SQLite 制約管理 (SQLite Constraint Management)"}} sqlite/add_row -.-> lab-552545{{"SQLite 制約管理 (SQLite Constraint Management)"}} sqlite/add_rows -.-> lab-552545{{"SQLite 制約管理 (SQLite Constraint Management)"}} sqlite/query_where -.-> lab-552545{{"SQLite 制約管理 (SQLite Constraint Management)"}} sqlite/verify_table -.-> lab-552545{{"SQLite 制約管理 (SQLite Constraint Management)"}} end

外部キー制約を持つテーブルの作成 (Create Tables with a Foreign Key Constraint)

このステップでは、customers テーブルと orders テーブルの 2 つのテーブルを作成し、それらの間に外部キー制約を確立します。この制約により、各注文が有効な顧客に関連付けられるようになります。

まず、ターミナルで次のコマンドを実行して、SQLite シェルを開きます。

sqlite3 /home/labex/project/database.db

このコマンドは、database.db という名前の SQLite データベースファイルへの接続を開きます。ファイルが存在しない場合、SQLite はファイルを作成します。sqlite> プロンプトが表示されるはずです。

次に、次の SQL コマンドを使用して customers テーブルを作成します。

CREATE TABLE customers (
    customer_id INTEGER PRIMARY KEY AUTOINCREMENT,
    first_name TEXT,
    last_name TEXT,
    email TEXT
);

このコマンドは、customers という名前のテーブルを、customer_idfirst_namelast_name、および email の 4 つの列で作成します。customer_id 列は主キーであり、新しい顧客ごとに自動的にインクリメントされます。

次に、customers テーブルを参照する外部キー制約を使用して、orders テーブルを作成します。

CREATE TABLE orders (
    order_id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER,
    order_date TEXT,
    total REAL,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

このコマンドは、orders という名前のテーブルを、order_idcustomer_idorder_date、および total の 4 つの列で作成します。order_id 列は主キーです。FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 句は外部キー制約を確立し、orders テーブルの customer_idcustomers テーブルの有効な customer_id を参照するようにします。

テーブルが作成されたことを確認するには、次のコマンドを使用します。

.tables

このコマンドは、データベース内のすべてのテーブルを一覧表示します。出力に customersorders の両方が表示されるはずです。

データの挿入と外部キー制約のテスト (Insert Data and Test the Foreign Key Constraint)

このステップでは、customers テーブルと orders テーブルにデータを挿入し、外部キー制約をテストします。

まず、SQLite で外部キー制約を有効にする必要があります (デフォルトでは無効になっています)。

PRAGMA foreign_keys = ON;

次に、customers テーブルにデータを挿入します。

INSERT INTO customers (first_name, last_name, email) VALUES
('John', 'Doe', '[email protected]'),
('Jane', 'Smith', '[email protected]');

このコマンドは、2 人の新しい顧客を customers テーブルに挿入します。customer_id は自動的に割り当てられます。

次に、既存の顧客の 1 人を参照して、orders テーブルに注文を挿入します。

INSERT INTO orders (customer_id, order_date, total) VALUES
(1, '2023-01-01', 100.00);

このコマンドは、新しい注文を orders テーブルに挿入し、customer_id が 1 の顧客に関連付けます。

次に、customers テーブルに存在しない customer_id を持つ注文を挿入してみます。

INSERT INTO orders (customer_id, order_date, total) VALUES
(99, '2023-01-02', 50.00);

次のようなエラーメッセージが表示されます:Error: FOREIGN KEY constraint failed。これは、外部キー制約が正しく機能しており、存在しない顧客の注文を作成できないことを確認します。

テーブル内のデータを表示するには、次のコマンドを使用します。

SELECT * FROM customers;
SELECT * FROM orders;

これらのコマンドは、それぞれ customers テーブルと orders テーブルの内容を表示します。

CHECK 制約の実装 (Implement a CHECK Constraint)

このステップでは、すべてのメールアドレスに @ 記号が含まれていることを保証する CHECK 制約を含む、新しい customers_with_check テーブルを作成します。

まず、CHECK 制約を使用して新しいテーブルを直接作成しましょう。

CREATE TABLE customers_with_check (
    customer_id INTEGER PRIMARY KEY AUTOINCREMENT,
    first_name TEXT,
    last_name TEXT,
    email TEXT CHECK (email LIKE '%@%')
);

このコマンドは、customers_with_check という名前の新しいテーブルを、email 列に @ 記号が含まれていることを保証する CHECK 制約付きで作成します。LIKE 演算子はパターンマッチングに使用され、% は任意の文字シーケンスに一致するワイルドカード文字です。

次に、既存の顧客データを新しいテーブルにコピーしましょう。

INSERT INTO customers_with_check (customer_id, first_name, last_name, email)
SELECT customer_id, first_name, last_name, email FROM customers;

次に、無効なメールアドレスを持つ新しい顧客を挿入してみます。

INSERT INTO customers_with_check (first_name, last_name, email) VALUES
('Charlie', 'Davis', 'invalid-email');

次のようなエラーメッセージが表示されるはずです:Error: CHECK constraint failed: email。これは、CHECK 制約が無効なメールアドレスの挿入を防いだことを示しています。

CHECK 制約が機能していることを確認するには、有効なメールアドレスを持つ顧客を挿入します。

INSERT INTO customers_with_check (first_name, last_name, email) VALUES
('Alice', 'Brown', '[email protected]');

このコマンドは、メールアドレスに @ 記号が含まれているため、正常に実行されるはずです。

複合キーを持つテーブルの作成 (Create a Table with a Composite Key)

このステップでは、student_id 列と course_id 列で構成される複合キーを持つ enrollments という名前のテーブルを作成します。

SQLite シェルで次の SQL ステートメントを実行します。

CREATE TABLE enrollments (
    student_id INTEGER,
    course_id INTEGER,
    enrollment_date TEXT,
    PRIMARY KEY (student_id, course_id)
);

このコマンドは、student_idcourse_id、および enrollment_date の 3 つの列を持つ enrollments という名前のテーブルを作成します。PRIMARY KEY (student_id, course_id) 句は、テーブルの主キーが student_id 列と course_id 列の両方で構成されることを指定します。これは、student_idcourse_id の組み合わせが、テーブル内の各行で一意である必要があることを意味します。

次に、enrollments テーブルにデータを挿入します。

INSERT INTO enrollments (student_id, course_id, enrollment_date) VALUES
(1, 101, '2023-01-01'),
(2, 101, '2023-01-02'),
(1, 102, '2023-01-03');

これにより、3 つの行が enrollments テーブルに挿入されます。

次に、既存の行と同じ student_idcourse_id を持つ行を挿入してみます。

INSERT INTO enrollments (student_id, course_id, enrollment_date) VALUES
(1, 101, '2023-01-04');

次のようなエラーメッセージが表示されるはずです:Error: UNIQUE constraint failed: enrollments.student_id, enrollments.course_id。これは、複合キー制約が重複行の挿入を防いだことを示しています。

テーブルが正しく作成されたことを確認するには、SQLite シェルで .tables コマンドを使用できます。

.tables

出力に enrollments が表示されるはずです。

まとめ (Summary)

この実験 (lab) では、データの整合性を確保するために、SQLite で制約を定義および実装する方法を学びました。外部キー制約を持つテーブルを作成し、データを検証するための CHECK 制約を実装し、複数の列に基づいて行を一意に識別するための複合キーを持つテーブルを作成しました。これらの制約を理解し活用することで、データの整合性を維持する堅牢で信頼性の高いデータベースを構築できます。