MySQL - ENUM: Hướng dẫn thân thiện cho người mới bắt đầu

Xin chào các nhà thuật toán tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của kiểu dữ liệu ENUM trong MySQL. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ khám phá chủ đề này từng bước một. Vậy, hãy lấy một tách cà phê (hoặc trà, nếu đó là sở thích của bạn), và cùng nhau bắt đầu nhé!

MySQL - ENUM

Kiểu dữ liệu ENUM trong MySQL

Hãy tưởng tượng bạn đang tạo một cơ sở dữ liệu cho một nhà hàng pizza. Bạn muốn lưu trữ kích thước của các loại pizza, nhưng bạn biết rằng chỉ có một số lựa chọn cụ thể: nhỏ, vừa và lớn. Đây là lúc ENUM phát huy tác dụng!

ENUM, viết tắt của "enumeration", là một cách nói sang trọng để nói "danh sách các lựa chọn đã định nghĩa trước". Nó giống như một câu hỏi nhiều lựa chọn mà MySQL chỉ cho phép các câu trả lời từ các lựa chọn bạn đã cho.

Hãy tạo một bảng đơn giản để minh họa:

CREATE TABLE pizza_orders (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(50),
size ENUM('small', 'medium', 'large')
);

Trong ví dụ này, size là cột ENUM của chúng ta. Nó chỉ có thể chứa một trong ba giá trị chúng ta đã chỉ định: 'small', 'medium', hoặc 'large'.

Các thuộc tính của ENUM

Bây giờ, hãy nói về một số tính năng thú vị của ENUM:

  1. Danh sách có thứ tự: Thứ tự bạn định nghĩa các giá trị ENUM quan trọng. MySQL gán một số cho mỗi giá trị, bắt đầu từ 1.

  2. Case-Insensitive: 'SMALL', 'Small', và 'small' đều được treat alike.

  3. Hiệu quả về không gian lưu trữ: ENUM rất hiệu quả về không gian lưu trữ. MySQL lưu trữ mỗi giá trị dưới dạng một số (1, 2, 3, v.v.) thay vì toàn bộ chuỗi.

  4. Giá trị mặc định: Nếu bạn không chỉ định một giá trị khi chèn một bản ghi, MySQL sẽ sử dụng giá trị đầu tiên trong danh sách ENUM làm giá trị mặc định.

Chèn các bản ghi với giá trị số của ENUM

Đây là một bí mật nhỏ: bạn có thể sử dụng số để chèn các giá trị ENUM! Hãy thử nó ra:

INSERT INTO pizza_orders (customer_name, size) VALUES
('Alice', 1),
('Bob', 2),
('Charlie', 3);

Trong trường hợp này:

  • 1 đại diện cho 'small'
  • 2 đại diện cho 'medium'
  • 3 đại diện cho 'large'

Hãy kiểm tra kết quả của chúng ta:

SELECT * FROM pizza_orders;

Bạn sẽ thấy rằng MySQL đã chính xác interpret các số thành các giá trị ENUM tương ứng. Rất tuyệt vời, phải không?

Chèn các bản ghi không hợp lệ

Nhưng điều gì sẽ xảy ra nếu chúng ta cố gắng lừa và chèn một giá trị không hợp lệ? Hãy tìm hiểu:

INSERT INTO pizza_orders (customer_name, size) VALUES ('David', 'extra-large');

Oops! MySQL sẽ đưa ra một lỗi vì 'extra-large' không nằm trong danh sách đã định nghĩa trước của chúng ta. Điều này giống như cố gắng chọn "D" trong một câu hỏi đúng/sai - nó simply doesn't work!

Lọc các bản ghi theo giá trị số của ENUM

Nhớ lại khi tôi đề cập rằng các giá trị ENUM được lưu trữ dưới dạng số? Chúng ta có thể tận dụng điều này khi lọc các bản ghi:

SELECT * FROM pizza_orders WHERE size = 2;

Truy vấn này sẽ trả về tất cả các đơn hàng cho pizza vừa. Nó giống như có một mã bí mật - 2 có nghĩa là vừa!

Lọc các bản ghi theo giá trị đọc được của ENUM

Tất nhiên, chúng ta cũng có thể lọc bằng cách sử dụng các giá trị ENUM thực tế:

SELECT * FROM pizza_orders WHERE size = 'large';

Truy vấn này sẽ lấy tất cả các đơn hàng cho pizza lớn. Rất trực quan, phải không?

nhược điểm của Kiểu dữ liệu ENUM

Bây giờ, tôi không thể gọi mình là một giáo viên giỏi nếu tôi không cảnh báo bạn về một số pitfall tiềm ẩn:

  1. Khả năng mở rộng有限的: Một khi bạn định nghĩa một ENUM, việc thêm hoặc xóa giá trị yêu cầu thay đổi cấu trúc bảng. Điều này giống như cố gắng thay đổi quy tắc giữa chừng!

  2. Phụ thuộc vào cơ sở dữ liệu: Nếu logic của ứng dụng của bạn phụ thuộc vào các giá trị ENUM, bạn sẽ liên kết ứng dụng của mình chặt chẽ với cấu trúc cơ sở dữ liệu.

  3. Giới hạn trong việc sắp xếp: Các giá trị ENUM được sắp xếp dựa trên giá trị số nội bộ, điều này có thể không phải lúc nào cũng là gì bạn muốn.

Các kiểu dữ liệu ENUM sử dụng một chương trình khách

Khi làm việc với ENUM qua một chương trình khách (như một script PHP hoặc Python), bạn thường sẽ tương tác với các giá trị đọc được. Tuy nhiên, điều quan trọng là phải biết về представление số nội bộ.

Dưới đây là bảng tóm tắt các phương pháp ENUM chúng ta đã thảo luận:

Phương pháp Ví dụ Mô tả
Tạo ENUM ENUM('small', 'medium', 'large') Định nghĩa các giá trị được phép
Chèn bằng chuỗi INSERT ... VALUES ('medium') Sử dụng giá trị ENUM thực tế
Chèn bằng số INSERT ... VALUES (2) Sử dụng đại diện số
Lọc bằng chuỗi WHERE size = 'large' Lọc bằng giá trị ENUM
Lọc bằng số WHERE size = 3 Lọc bằng đại diện số

Nhớ rằng, bất kể bạn đang sử dụng một chương trình khách hay làm việc trực tiếp trong MySQL, các nguyên tắc này vẫn giữ nguyên.

Và thế là xong, các bạn! Chúng ta đã cùng nhau hành trình qua vùng đất của MySQL ENUMs. Từ việc tạo chúng đến việc chèn giá trị và thậm chí là khám phá bí mật numeric identity của chúng, bạn bây giờ đã được trang bị để sử dụng ENUMs trong các cuộc phiêu lưu cơ sở dữ liệu của mình.

Chỉ cần nhớ, giống như việc chọn topping cho pizza, ENUMs rất tuyệt vời khi bạn có một bộ các tùy chọn cố định. Nhưng nếu bạn liên tục muốn thêm mới các hương vị, có lẽ đã đến lúc xem xét một phương pháp tiếp cận khác.

Tiếp tục thực hành, giữ vững sự tò mò, và chúc bạn lập trình vui vẻ! Ai biết được, có lẽ lần sau bạn đặt pizza, bạn sẽ nghĩ về cấu trúc cơ sở dữ liệu. (Or maybe that's just me? ?)

Credits: Image by storyset