Để giúp bạn hiểu rõ hơn về cách sử dụng PRIMARY KEYFOREIGN KEY, dưới đây là một ví dụ thực tế với các bảng giả định, bao gồm dữ liệu mẫu cho từng bảng. Các bảng sẽ mô phỏng một hệ thống quản lý khách hàng và đơn hàng, trong đó:

  • Bảng customers chứa thông tin về khách hàng.
  • Bảng orders chứa thông tin về các đơn hàng của khách hàng, trong đó có sử dụng FOREIGN KEY để tham chiếu đến bảng customers.

1. Bảng customers

Bảng customers sẽ lưu thông tin cơ bản của khách hàng, với customer_idPRIMARY KEY để xác định duy nhất mỗi khách hàng.

shell
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20),
    address VARCHAR(255)
);

Dữ liệu giả định cho bảng customers:

customer_idcustomer_nameemailphoneaddress
1John Doejohn@example.com123-456-7890123 Elm Street
2Jane Smithjane@example.com987-654-3210456 Oak Street
3Alice Johnsonalice@example.com555-123-4567789 Pine Street
4Bob Brownbob@example.com444-555-6666101 Maple Avenue

2. Bảng orders

Bảng orders lưu trữ thông tin về các đơn hàng. Trong đó, customer_idFOREIGN KEY tham chiếu đến cột customer_id của bảng customers để đảm bảo rằng mỗi đơn hàng phải thuộc về một khách hàng hợp lệ.

shell
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    order_date DATE NOT NULL,
    customer_id INT,
    amount DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    ON DELETE CASCADE
);

Dữ liệu giả định cho bảng orders:

order_idorder_datecustomer_idamount
1012023-09-011150.75
1022023-09-052200.00
1032023-09-10199.99
1042023-09-153250.50

3. Mối quan hệ giữa hai bảng

  • Bảng customers chứa danh sách khách hàng với customer_id là khóa chính (PRIMARY KEY).
  • Bảng orderscustomer_id là khóa ngoại (FOREIGN KEY) tham chiếu đến customer_id trong bảng customers. Điều này đảm bảo rằng tất cả các đơn hàng phải thuộc về khách hàng đã tồn tại trong bảng customers.

Ví dụ về câu truy vấn kết hợp dữ liệu từ cả hai bảng:

shell
SELECT o.order_id, o.order_date, o.amount, c.customer_name, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id;

Kết quả của truy vấn:

order_idorder_dateamountcustomer_nameemail
1012023-09-01150.75John Doejohn@example.com
1022023-09-05200.00Jane Smithjane@example.com
1032023-09-1099.99John Doejohn@example.com
1042023-09-15250.50Alice Johnsonalice@example.com

4. Xóa bản ghi với ON DELETE CASCADE

Với ràng buộc ON DELETE CASCADE trong bảng orders, nếu một bản ghi trong bảng customers bị xóa, tất cả các đơn hàng tương ứng trong bảng orders sẽ tự động bị xóa.

Ví dụ, nếu bạn xóa khách hàng có customer_id = 1 (John Doe):

shell
DELETE FROM customers WHERE customer_id = 1;

Sau khi thực thi câu lệnh này, tất cả các đơn hàng của John Doe trong bảng orders sẽ bị xóa. Dữ liệu trong bảng orders sẽ còn lại như sau:

order_idorder_datecustomer_idamount
1022023-09-052200.00
1042023-09-153250.50

5. Tóm tắt

  • Bảng customers chứa thông tin khách hàng, trong đó customer_id là khóa chính.
  • Bảng orders lưu trữ các đơn hàng và có customer_id là khóa ngoại tham chiếu đến bảng customers.
  • Ràng buộc FOREIGN KEY với ON DELETE CASCADE đảm bảo rằng khi khách hàng bị xóa, tất cả các đơn hàng liên quan cũng bị xóa theo.

Hệ thống này đảm bảo dữ liệu giữa các bảng có sự liên kết chặt chẽ, và các ràng buộc PRIMARY KEYFOREIGN KEY đảm bảo tính toàn vẹn và chính xác của dữ liệu trong hệ thống quản lý khách hàng và đơn hàng.