Câu lệnh CREATE TABLE trong MySQL được sử dụng để tạo bảng mới trong cơ sở dữ liệu. Việc hiểu rõ cú pháp và cách sử dụng câu lệnh này rất quan trọng khi bạn muốn thiết kế cơ sở dữ liệu. Chúng ta sẽ bắt đầu từ ví dụ cơ bản và dần đến các tình huống nâng cao hơn.

1. Cú pháp cơ bản của câu lệnh CREATE TABLE

table_name
  • id: Cột kiểu INT, là khóa chính (PRIMARY KEY), và tự động tăng giá trị (AUTO_INCREMENT).
  • name: Cột kiểu VARCHAR với độ dài tối đa 100 ký tự, không cho phép giá trị NULL.
  • age: Cột kiểu INT, lưu trữ độ tuổi của nhân viên.
  • salary: Cột kiểu DECIMAL lưu trữ lương của nhân viên với tối đa 10 chữ số, trong đó có 2 chữ số thập phân.

2. Thêm các ràng buộc (Constraints)

a. Khóa chính (PRIMARY KEY)

Khóa chính là một ràng buộc giúp xác định duy nhất mỗi bản ghi trong bảng.

id

Cột department_id trong bảng employees là khóa ngoại, liên kết với cột id của bảng departments. Điều này đảm bảo rằng mỗi nhân viên thuộc một phòng ban có tồn tại trong bảng departments.

c. Ràng buộc NOT NULL

Ràng buộc NOT NULL không cho phép giá trị rỗng trong một cột.

name

Cột email chỉ có thể chứa các giá trị không trùng lặp.

e. Ràng buộc DEFAULT

Ràng buộc DEFAULT thiết lập giá trị mặc định cho một cột khi không có giá trị được cung cấp.

INT
  • salary: Kiểu DECIMAL(10, 2) lưu trữ các số có tối đa 10 chữ số, trong đó có 2 chữ số thập phân.
  • hire_date: Kiểu DATE lưu trữ ngày.

4. Tạo bảng với chỉ mục (INDEX)

Chỉ mục (INDEX) giúp tăng tốc độ truy vấn dữ liệu, đặc biệt với các bảng lớn.

name

Bảng này sẽ bị xóa tự động khi phiên làm việc kết thúc hoặc người dùng thoát khỏi cơ sở dữ liệu.


6. Tạo bảng với phân vùng (PARTITION)

Phân vùng giúp chia nhỏ dữ liệu trong bảng để quản lý và truy vấn hiệu quả hơn.

salary

Bảng products chứa khóa ngoại category_id để liên kết với bảng categories, tạo mối quan hệ một danh mục nhiều sản phẩm.


8. Tạo bảng với AUTO_INCREMENT bắt đầu từ giá trị tùy chỉnh

Bạn có thể chỉ định giá trị bắt đầu cho cột AUTO_INCREMENT.

orders

Ràng buộc CHECK trong bảng employees đảm bảo rằng giá trị của age phải lớn hơn hoặc bằng 18.


10. Sử dụng IF NOT EXISTS để tránh lỗi khi bảng đã tồn tại

Khi tạo bảng, bạn có thể sử dụng mệnh đề IF NOT EXISTS để tránh lỗi nếu bảng đã tồn tại.

employees

Bảng này sẽ được chia thành 4 phân vùng dựa trên giá trị hash của cột department_id. Khi bạn thêm một bản ghi mới, MySQL sẽ tính toán giá trị hash của department_id và tự động phân loại vào một trong các phân vùng.


2. Tạo bảng với phân vùng theo LIST

Phân vùng theo LIST giúp chia bảng dựa trên danh sách các giá trị cụ thể.

orders

Bảng order_items liên kết với bảng ordersproducts thông qua các cột order_idproduct_id. Điều này tạo ra một mối quan hệ nhiều-nhiều giữa các đơn hàng và sản phẩm, cho phép một đơn hàng có nhiều sản phẩm và một sản phẩm xuất hiện trong nhiều đơn hàng.


4. Tạo bảng với các kiểu dữ liệu JSON

MySQL hỗ trợ kiểu dữ liệu JSON, cho phép lưu trữ các đối tượng JSON phức tạp trực tiếp trong cột của bảng.

attributes

Lệnh này lưu trữ dữ liệu về một laptop Dell với các thuộc tính đặc biệt trong định dạng JSON.


5. Tạo bảng với khóa ngoại có hành vi ON DELETE CASCADE

Hành vi ON DELETE CASCADE được sử dụng để tự động xóa tất cả các bản ghi liên quan khi một bản ghi trong bảng cha bị xóa.

customers

Trong bảng này, final_price được tính tự động bằng công thức price - discount mà không cần phải lưu trữ trực tiếp trong cơ sở dữ liệu.


7. Tạo bảng với chỉ mục không duy nhất (INDEX)

Chỉ mục không duy nhất (INDEX) giúp cải thiện tốc độ truy vấn nhưng không bắt buộc giá trị trong cột đó phải duy nhất.

department_id

Chỉ mục UNIQUE trên cột email đảm bảo rằng không có hai nhân viên nào có cùng địa chỉ email.


9. Tạo bảng với kiểu dữ liệu không gian (SPATIAL)

MySQL hỗ trợ các loại dữ liệu không gian như POINT, LINESTRING, và POLYGON để lưu trữ thông tin địa lý.

coordinates

Trong bảng này:

  • Dữ liệu được phân vùng dựa trên năm (RANGE theo YEAR(sale_date)).
  • Sau đó, mỗi phân vùng lại được chia nhỏ thành 4 phân vùng con dựa trên tháng (HASH theo MONTH(sale_date)).

Điều này giúp quản lý dữ liệu doanh số theo năm và tháng một cách hiệu quả.


11. Tạo bảng với bảng kế thừa (InnoDB vs MyISAM)

MySQL hỗ trợ nhiều loại storage engine, trong đó phổ biến nhất là InnoDBMyISAM. Bạn có thể chỉ định storage engine khi tạo bảng:

blog_posts

Cột gender chỉ có thể nhận một trong các giá trị: 'Male', 'Female', hoặc 'Other'.

  • Kiểu dữ liệu SET: Lưu trữ một hoặc nhiều giá trị từ một danh sách cố định.
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    skills SET('PHP', 'JavaScript', 'Python', 'Java')
);

Cột skills có thể lưu trữ nhiều kỹ năng cho một nhân viên, ví dụ: PHP, JavaScript.


Những ví dụ trên bao quát nhiều tình huống sử dụng nâng cao cho câu lệnh CREATE TABLE trong MySQL, giúp tối ưu hóa hiệu suất, quản lý dữ liệu hiệu quả và phù hợp với các yêu cầu cụ thể trong các hệ thống phức tạp.