データの挿入と参照整合性の実施
このステップでは、customersテーブルとordersテーブルにデータを挿入し、参照整合性が維持されるようにします。これは、customersテーブルに存在しない顧客の注文を追加できないことを意味します。
参照整合性について
参照整合性(Referential Integrity)は、テーブル間のリレーションシップが一貫性を保つことを保証します。この場合、ordersテーブルのcustomer_idはcustomersテーブルに存在する必要があります。
ステップ 1: customersテーブルへのデータの挿入
psqlシェルで次の SQL コマンドを使用して、customersテーブルにデータを挿入します。
INSERT INTO customers (first_name, last_name, email) VALUES
('John', 'Doe', 'john.doe@example.com'),
('Jane', 'Smith', 'jane.smith@example.com'),
('David', 'Lee', 'david.lee@example.com');
このコマンドは、customersテーブルに 3 人の顧客を追加します。customer_idは自動的に生成されます。
ステップ 2: customersテーブルへのデータ挿入の確認
customersテーブルをクエリして、データが正しく挿入されたことを確認します。
SELECT * FROM customers;
挿入した 3 人の顧客と、自動的に生成されたcustomer_idの値が表示されるはずです。出力は次のようになります。
customer_id | first_name | last_name | email
-------------+------------+-----------+------------------------
1 | John | Doe | john.doe@example.com
2 | Jane | Smith | jane.smith@example.com
3 | David | Lee | david.lee@example.com
(3 rows)
ステップ 3: ordersテーブルへのデータの挿入
customersテーブルからcustomer_idの値を参照して、ordersテーブルにデータを挿入します。
INSERT INTO orders (customer_id, order_date, total_amount) VALUES
(1, '2023-11-01', 100.00),
(2, '2023-11-05', 250.50),
(1, '2023-11-10', 75.25),
(3, '2023-11-15', 120.00);
このコマンドは、ordersテーブルに 4 つの注文を追加します。各注文は、customersテーブルのcustomer_idに関連付けられています。
ステップ 4: ordersテーブルへのデータ挿入の確認
ordersテーブルをクエリして、データが正しく挿入されたことを確認します。
SELECT * FROM orders;
挿入した 4 つの注文が表示されるはずです。出力は次のようになります。
order_id | customer_id | order_date | total_amount
----------+-------------+------------+--------------
1 | 1 | 2023-11-01 | 100.00
2 | 2 | 2023-11-05 | 250.50
3 | 1 | 2023-11-10 | 75.25
4 | 3 | 2023-11-15 | 120.00
(4 rows)
ステップ 5: 無効なデータの挿入の試行(参照整合性のデモンストレーション)
参照整合性制約を示すために、customersテーブルに存在しないcustomer_idを持つ注文を挿入してみます。
INSERT INTO orders (customer_id, order_date, total_amount) VALUES
(4, '2023-11-20', 50.00);
次のようなエラーメッセージが表示されるはずです。
ERROR: insert or update on table "orders" violates foreign key constraint "orders_customer_id_fkey"
DETAIL: Key (customer_id)=(4) is not present in table "customers".
このエラーメッセージは、外部キー制約が機能していることを確認します。データベースは、customer_id 4 がcustomersテーブルに存在しないため、注文の挿入を防止します。
これで、参照整合性を確保しながら、customersテーブルとordersテーブルにデータを正常に挿入できました。