はじめに (Introduction)
この実験 (lab) では、データ整合性を確保するために、SQLite の制約管理について学びます。まず、外部キー制約を定義してテーブル間の関係を確立し、CHECK
制約を実装し、複合キーを作成します。最後に、制約違反をテストして、SQLite がこれらのルールをどのように適用するかを理解します。この実践的な経験を通して、SQLite データベース内でデータの整合性を維持する方法を実践的に理解することができます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験 (lab) では、データ整合性を確保するために、SQLite の制約管理について学びます。まず、外部キー制約を定義してテーブル間の関係を確立し、CHECK
制約を実装し、複合キーを作成します。最後に、制約違反をテストして、SQLite がこれらのルールをどのように適用するかを理解します。この実践的な経験を通して、SQLite データベース内でデータの整合性を維持する方法を実践的に理解することができます。
このステップでは、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_id
、first_name
、last_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_id
、customer_id
、order_date
、および total
の 4 つの列で作成します。order_id
列は主キーです。FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
句は外部キー制約を確立し、orders
テーブルの customer_id
が customers
テーブルの有効な customer_id
を参照するようにします。
テーブルが作成されたことを確認するには、次のコマンドを使用します。
.tables
このコマンドは、データベース内のすべてのテーブルを一覧表示します。出力に customers
と orders
の両方が表示されるはずです。
このステップでは、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
制約を含む、新しい 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]');
このコマンドは、メールアドレスに @
記号が含まれているため、正常に実行されるはずです。
このステップでは、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_id
、course_id
、および enrollment_date
の 3 つの列を持つ enrollments
という名前のテーブルを作成します。PRIMARY KEY (student_id, course_id)
句は、テーブルの主キーが student_id
列と course_id
列の両方で構成されることを指定します。これは、student_id
と course_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_id
と course_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
が表示されるはずです。
この実験 (lab) では、データの整合性を確保するために、SQLite で制約を定義および実装する方法を学びました。外部キー制約を持つテーブルを作成し、データを検証するための CHECK
制約を実装し、複数の列に基づいて行を一意に識別するための複合キーを持つテーブルを作成しました。これらの制約を理解し活用することで、データの整合性を維持する堅牢で信頼性の高いデータベースを構築できます。