Câu lệnh UPDATE trong MySQL được sử dụng để cập nhật dữ liệu đã tồn tại trong bảng. Hướng dẫn này sẽ bao gồm tất cả các trường hợp, từ ví dụ cơ bản đến nâng cao, với giải thích chi tiết và minh họa đầy đủ.

Giới thiệu câu lệnh UPDATE trong MySQL

1. Cấu trúc cơ bản của câu lệnh UPDATE

Cú pháp cơ bản của câu lệnh UPDATE trong MySQL là:

table_name

Câu lệnh trên sẽ cập nhật giá trị email thành '[email protected]' cho dòng có id = 1.

2. Cập nhật nhiều cột

Bạn có thể cập nhật nhiều cột cùng lúc bằng cách liệt kê chúng trong câu lệnh SET.

Ví dụ:

Giả sử bạn muốn cập nhật cả tên và email của người dùng có id = 2:

name

Câu lệnh trên sẽ cập nhật giá trị của cột email cho tất cả các dòng trong bảng users.

4. Cập nhật dựa trên điều kiện

Bạn có thể sử dụng WHERE để chỉ định một hoặc nhiều điều kiện cho việc cập nhật dữ liệu.

Ví dụ:

Nếu bạn muốn cập nhật tên của tất cả người dùng có email thuộc miền @example.com:

name

Câu lệnh trên sẽ cộng thêm 10 vào giá trị hiện tại của cột stock cho sản phẩm có product_id = 101.

6. Cập nhật nhiều dòng với điều kiện khác nhau

Bạn có thể sử dụng hàm CASE để cập nhật giá trị khác nhau dựa trên các điều kiện khác nhau cho các dòng khác nhau trong cùng một câu lệnh UPDATE.

Ví dụ:

Giả sử bạn muốn cập nhật bảng users sao cho người dùng có id = 1 có tên mới là 'Alice', và người dùng có id = 2 có tên mới là 'Bob':

name

Nếu customer_id = 5 không tồn tại trong bảng customers, câu lệnh này sẽ trả về lỗi.

8. Cập nhật với dữ liệu từ bảng khác

Bạn có thể cập nhật dữ liệu trong một bảng dựa trên dữ liệu từ bảng khác thông qua việc kết hợp (JOIN) hai bảng trong câu lệnh UPDATE.

Ví dụ:

Giả sử bạn có bảng productssuppliers, và bạn muốn cập nhật tên nhà cung cấp (supplier_name) trong bảng products dựa trên dữ liệu từ bảng suppliers:

products

Câu lệnh trên sẽ chỉ cập nhật 5 dòng đầu tiên có status = 'pending' thành 'processed'.

10. Cập nhật với ORDER BY

MySQL cho phép bạn kết hợp ORDER BY với UPDATE để sắp xếp các dòng được cập nhật theo một thứ tự nhất định.

Ví dụ:

Giả sử bạn muốn cập nhật các dòng có status = 'pending' theo thứ tự thời gian từ cũ nhất đến mới nhất:

status = 'pending'

Câu lệnh trên sẽ cập nhật cột price của sản phẩm có product_id = 101 về giá trị mặc định là 100.

12. Sử dụng UPDATE IGNORE

Nếu bạn muốn MySQL bỏ qua các lỗi (ví dụ, vi phạm khóa ngoại hoặc khóa duy nhất) trong khi cập nhật, bạn có thể sử dụng UPDATE IGNORE.

Ví dụ:

Giả sử bạn có bảng users với cột email là duy nhất. Bạn có thể sử dụng UPDATE IGNORE để bỏ qua lỗi khi cập nhật nếu có vi phạm:

email

Câu lệnh trên sẽ cập nhật nội dung của tệp mới vào bảng files.

14. Tối ưu hóa và thực hiện hiệu quả câu lệnh UPDATE

  • Sử dụng chỉ mục (Indexes): Đảm bảo rằng các cột trong điều kiện WHERE được lập chỉ mục để tăng hiệu suất.
  • Giới hạn số lượng dòng được cập nhật: Sử dụng LIMIT nếu bạn chỉ cần cập nhật một số lượng dòng nhỏ.
  • Sử dụng EXPLAIN: Để kiểm tra cách MySQL thực hiện câu lệnh UPDATE, bạn có thể sử dụng EXPLAIN trước câu lệnh.

Ví dụ:

UPDATE

Trong ví dụ này, bạn cập nhật tên phòng ban (department_name) cho nhân viên có employee_id = 123 từ bảng departments dựa trên giá trị department_id trong cả hai bảng.

2. Cập nhật với truy vấn con (Subquery)

Sử dụng một truy vấn con (subquery) trong phần SET hoặc WHERE của câu lệnh UPDATE để cập nhật dữ liệu dựa trên kết quả của một truy vấn khác.

Ví dụ:

Giả sử bạn muốn cập nhật lương (salary) của nhân viên bằng với mức lương cao nhất trong cùng một phòng ban (department_id).

department_id = 5

Câu lệnh trên sẽ tăng lương cho nhân viên dựa trên cấp bậc, với mức tăng khác nhau tùy thuộc vào chức danh.

4. Cập nhật với khóa ngoại (FOREIGN KEY) và tính toàn vẹn dữ liệu

Khi làm việc với các bảng có ràng buộc khóa ngoại, bạn cần đặc biệt chú ý đến việc cập nhật các cột liên quan đến khóa ngoại. Để tránh vi phạm ràng buộc, bạn có thể sử dụng ON UPDATE CASCADE.

Ví dụ:

Giả sử bạn có hai bảng orderscustomers, với customer_id là khóa ngoại trong bảng orders. Khi bạn cập nhật customer_id trong bảng customers, các bản ghi tương ứng trong bảng orders cũng sẽ được cập nhật tự động.

customer_id

Câu lệnh này sẽ tự động cập nhật customer_id trong bảng orders cho các đơn hàng liên quan mà không cần phải làm thủ công.

5. Cập nhật đồng thời nhiều bảng với UPDATEJOIN

Bạn có thể cập nhật nhiều bảng cùng một lúc bằng cách sử dụng JOIN để liên kết các bảng và thực hiện cập nhật trên cả hai.

Ví dụ:

Giả sử bạn muốn cập nhật đồng thời bảng employees và bảng salaries, dựa trên điều kiện của department_id.

employees

Câu lệnh trên sẽ chọn ra 10 nhân viên có lương thấp nhất trong phòng ban department_id = 2 và tăng lương cho họ thêm 500.

7. Cập nhật dữ liệu trong cột có kiểu dữ liệu JSON

Kể từ MySQL 5.7, bạn có thể lưu trữ và cập nhật dữ liệu JSON trong các bảng của mình. Cập nhật dữ liệu JSON đòi hỏi phải sử dụng các hàm đặc biệt như JSON_SET, JSON_REPLACE, hoặc JSON_REMOVE.

Ví dụ:

Giả sử bạn có bảng employees với cột profile lưu trữ dữ liệu JSON, và bạn muốn cập nhật địa chỉ của một nhân viên cụ thể.

address

Câu lệnh trên sẽ cập nhật nội dung file vào cột file_content cho tài liệu có document_id = 101.

9. Cập nhật với khóa tự động tăng (AUTO_INCREMENT)

Trực tiếp cập nhật giá trị của cột có kiểu AUTO_INCREMENT là không được phép trong MySQL. Tuy nhiên, bạn có thể điều chỉnh giá trị tự động tăng bằng cách sử dụng truy vấn ALTER TABLE.

Ví dụ:

Giả sử bạn có bảng products với cột product_idAUTO_INCREMENT, và bạn muốn điều chỉnh giá trị tiếp theo của cột này.

product_id

Trigger này sẽ tự động trừ số lượng hàng tồn kho mỗi khi có cập nhật đơn hàng mới.

11. Cập nhật dữ liệu với khóa chính phức tạp (Composite Primary Key)

Trong một số trường hợp, bảng của bạn có thể có khóa chính là tổ hợp của nhiều cột. Khi đó, việc cập nhật dữ liệu yêu cầu bạn chỉ định cả hai cột của khóa chính.

Ví dụ:

Giả sử bạn có bảng project_assignments với khóa chính là tổ hợp của hai cột employee_idproject_id. Bạn có thể cập nhật trạng thái dự án cho một nhân viên như sau:

employee_id = 1

Câu lệnh này cập nhật thời gian đăng nhập cuối cùng cho những người dùng đã đăng nhập trong vòng 7 ngày qua.

Trên đây là tổng hợp tất cả các trường hợp nâng cao của câu lệnh UPDATE trong MySQL, giúp bạn làm việc với dữ liệu một cách linh hoạt và hiệu quả trong nhiều tình huống phức tạp.