1. Giới thiệu

PRIMARY KEYFOREIGN KEY là hai loại MySQL Constraints quan trọng và được sử dụng phổ biến trong quá trình thiết kế cơ sở dữ liệu. Chúng đảm bảo tính toàn vẹn của dữ liệu và tạo mối quan hệ giữa các bảng.

  • PRIMARY KEY: Xác định một cột (hoặc tập hợp các cột) mà mỗi giá trị là duy nhấtkhông thể để trống. Đây là một khóa chính giúp xác định duy nhất mỗi bản ghi trong bảng.
  • FOREIGN KEY: Được sử dụng để thiết lập mối quan hệ giữa hai bảng, đảm bảo rằng một giá trị trong bảng này phải tồn tại trong bảng khác.

2. PRIMARY KEY

a. Chức năng của PRIMARY KEY

  • PRIMARY KEY đảm bảo rằng mỗi bản ghi trong bảng đều có một giá trị duy nhất cho cột hoặc nhóm cột được chỉ định.
  • Một bảng chỉ có thể có một khóa chính, nhưng một khóa chính có thể bao gồm nhiều cột (khóa chính phức hợp).

b. Cú pháp PRIMARY KEY trong MySQL

Bạn có thể định nghĩa PRIMARY KEY khi tạo bảng bằng cách sử dụng cú pháp sau:

shell
CREATE TABLE table_name (
    column_name datatype PRIMARY KEY
);

Ngoài ra, bạn cũng có thể định nghĩa PRIMARY KEY với nhiều cột:

shell
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    PRIMARY KEY (column1, column2)
);

c. Ví dụ về PRIMARY KEY

Ví dụ 1: Tạo bảng employees với cột employee_id là khóa chính

shell
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    department VARCHAR(50)
);

Trong ví dụ này, cột employee_id là khóa chính, nghĩa là mỗi nhân viên phải có một employee_id duy nhất và không thể để trống.

Ví dụ 2: Tạo bảng orders với khóa chính bao gồm nhiều cột

shell
CREATE TABLE orders (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);

Trong ví dụ này, khóa chính là sự kết hợp của hai cột order_idproduct_id, đảm bảo rằng mỗi bản ghi trong bảng là duy nhất dựa trên sự kết hợp của hai cột này.

d. Thêm khóa chính vào bảng đã tồn tại

Bạn có thể thêm PRIMARY KEY vào bảng đã tồn tại bằng câu lệnh ALTER TABLE:

shell
ALTER TABLE employees
ADD PRIMARY KEY (employee_id);

e. Xóa khóa chính

Để xóa khóa chính, bạn có thể sử dụng câu lệnh sau:

shell
ALTER TABLE employees
DROP PRIMARY KEY;

3. FOREIGN KEY

a. Chức năng của FOREIGN KEY

  • FOREIGN KEY đảm bảo rằng một giá trị trong bảng này tham chiếu đến một giá trị hợp lệ trong bảng khác.
  • Nó giúp duy trì tính toàn vẹn tham chiếu bằng cách kiểm soát mối quan hệ giữa hai bảng. Mỗi giá trị trong cột khóa ngoại phải tồn tại trong cột khóa chính của bảng tham chiếu.

b. Cú pháp FOREIGN KEY trong MySQL

Khi tạo bảng, bạn có thể thêm FOREIGN KEY như sau:

shell
CREATE TABLE table_name (
    column_name datatype,
    FOREIGN KEY (column_name) REFERENCES referenced_table(referenced_column)
);

c. Ví dụ về FOREIGN KEY

Ví dụ 3: Tạo bảng orders với cột customer_id là khóa ngoại tham chiếu tới bảng customers

shell
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(100)
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    order_date DATE,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Trong ví dụ này:

  • Cột customer_id trong bảng orders là khóa ngoại và tham chiếu tới cột customer_id trong bảng customers.
  • Điều này đảm bảo rằng mỗi đơn hàng trong bảng orders phải thuộc về một khách hàng có trong bảng customers.

d. Thêm khóa ngoại vào bảng đã tồn tại

Bạn có thể thêm FOREIGN KEY vào bảng đã tồn tại bằng câu lệnh ALTER TABLE:

shell
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

e. Xóa khóa ngoại

Để xóa khóa ngoại, bạn sử dụng câu lệnh sau:

shell
ALTER TABLE orders
DROP FOREIGN KEY fk_customer;

4. Cách thức hoạt động của PRIMARY KEYFOREIGN KEY trong MySQL

a. Mối quan hệ giữa PRIMARY KEYFOREIGN KEY

  • PRIMARY KEY được sử dụng để xác định duy nhất một bản ghi trong bảng.
  • FOREIGN KEY tạo mối quan hệ giữa hai bảng bằng cách tham chiếu tới cột PRIMARY KEY của bảng khác. Nó đảm bảo rằng các giá trị trong bảng con (child table) phải có bản ghi tương ứng trong bảng cha (parent table).

Ví dụ:

  • Bảng customerscustomer_idPRIMARY KEY.
  • Bảng orderscustomer_idFOREIGN KEY tham chiếu đến customers(customer_id).

b. Tính toàn vẹn tham chiếu (Referential Integrity)

Tính toàn vẹn tham chiếu đảm bảo rằng các bản ghi trong bảng con không thể tồn tại nếu không có bản ghi tương ứng trong bảng cha. Điều này giúp duy trì dữ liệu chính xác và nhất quán giữa các bảng có mối quan hệ.

c. Hành vi khi xóa hoặc cập nhật dữ liệu

Khi bạn xóa hoặc cập nhật một bản ghi trong bảng cha, có thể xảy ra các hành vi sau trên bảng con (nếu có ràng buộc khóa ngoại):

  • CASCADE: Khi một bản ghi trong bảng cha bị xóa, tất cả các bản ghi liên quan trong bảng con cũng bị xóa.
  • SET NULL: Khi bản ghi trong bảng cha bị xóa, các bản ghi liên quan trong bảng con sẽ được đặt giá trị khóa ngoại thành NULL.
  • NO ACTION: Không thực hiện hành động gì khi xóa bản ghi trong bảng cha (đây là hành vi mặc định nếu không chỉ định hành vi cụ thể).

Ví dụ 4: Sử dụng ON DELETE CASCADE

shell
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(100)
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    order_date DATE,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    ON DELETE CASCADE
);

Trong ví dụ này, nếu một khách hàng trong bảng customers bị xóa, tất cả các đơn hàng liên quan trong bảng orders cũng sẽ tự động bị xóa nhờ vào ràng buộc ON DELETE CASCADE.

Kết luận

PRIMARY KEYFOREIGN KEY là những công cụ quan trọng trong SQL để đảm bảo tính toàn vẹn dữ liệu và duy trì mối quan hệ giữa các bảng.

  • PRIMARY KEY giúp xác định duy nhất các bản ghi trong một bảng.
  • FOREIGN KEY tạo mối quan hệ tham chiếu giữa hai bảng, đảm bảo rằng các giá trị trong bảng con phải tồn tại trong bảng cha.

Việc hiểu rõ cách sử dụng PRIMARY KEYFOREIGN KEY là cực kỳ quan trọng khi thiết kế cơ sở dữ liệu phức tạp với nhiều bảng liên quan. Hãy thử áp dụng các ví dụ trên trong các bài tập và dự án thực tế để hiểu sâu hơn về cách hoạt động của chúng trên CodeTutHub!