Sửa lỗi MySQL 1175: Cách vô hiệu hóa Chế độ Safe Update

beginner🗄️ MySQL2026-04-06| MySQL Workbench, MySQL Server 5.7/8.0+, Windows, macOS, hoặc Linux

Error Message

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
#mysql#safe-update-mode#sql-workbench#quan-tri-co-so-du-lieu#loi-sql

Vấn đề

Điều này có thể xảy ra với bất kỳ ai trong chúng ta. Bạn đang cố gắng dọn dẹp một tập dữ liệu trong MySQL Workbench—có lẽ là đánh dấu 1.500 người dùng không hoạt động—nhưng câu lệnh UPDATE của bạn gặp phải một trở ngại lớn. Thay vì các hàng được sửa đổi, bạn nhận được một thông báo từ chối gây khó chịu:

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.

Đây không phải là một lỗi. Đó là một tính năng bảo vệ tích hợp sẵn. Theo mặc định, MySQL Workbench ngăn bạn chạy các truy vấn có thể vô tình xóa sạch toàn bộ một bảng. Nó yêu cầu bạn phải nhắm mục tiêu vào một khóa chính cụ thể hoặc xác nhận rõ ràng rằng bạn có ý định thực hiện một thao tác hàng loạt.

Tại sao lỗi này xảy ra

Tính năng Safe Updates là người bảo vệ cho dữ liệu của bạn. Khi được kích hoạt, nó sẽ chặn bất kỳ câu lệnh UPDATE hoặc DELETE nào không đáp ứng các yêu cầu cụ thể sau:

  • Truy vấn phải bao gồm mệnh đề WHERE tham chiếu đến một Cột Khóa (như id hoặc uuid).
  • Truy vấn phải bao gồm mệnh đề LIMIT để giới hạn phạm vi ảnh hưởng.

Nếu bạn cố gắng cập nhật các bản ghi bằng một cột không được lập chỉ mục—như trường 'category' hoặc 'status'—tính năng kiểm tra an toàn sẽ được kích hoạt. Nó giả định rằng bạn có thể đã quên hoàn toàn bộ lọc của mình.

Giải pháp 1: Khắc phục nhanh bằng SQL (Theo phiên làm việc)

Bạn cần thực hiện cập nhật hàng loạt một lần? Bạn có thể tạm thời vô hiệu hóa hạn chế cho kết nối hiện tại của mình. Đây là cách tiếp cận gọn gàng nhất vì nó không làm thay đổi các cài đặt bảo mật chung của bạn.

Bước 1: Hạ hàng rào bảo vệ

SET SQL_SAFE_UPDATES = 0;

Bước 2: Thực thi truy vấn của bạn

Giờ đây, MySQL sẽ cho phép thao tác này. Ví dụ: cập nhật những người dùng chưa đăng nhập kể từ đầu năm 2024:

UPDATE users 
SET status = 'archived' 
WHERE last_login < '2024-01-01';

Bước 3: Khôi phục hàng rào bảo vệ

Đừng để cửa mở. Sau khi hoàn thành công việc, hãy bật lại tính năng bảo vệ:

SET SQL_SAFE_UPDATES = 1;

Giải pháp 2: Vô hiệu hóa Safe Updates trong giao diện Workbench

Nếu bạn thường xuyên làm việc với các tập dữ liệu phân tích lớn, tính năng này có thể giống như một trở ngại hơn là sự trợ giúp. Bạn có thể vô hiệu hóa nó vĩnh viễn trong cài đặt cục bộ của mình.

  • Khởi chạy MySQL Workbench.
  • Đi tới Edit > Preferences (người dùng macOS: MySQL Workbench > Settings).
  • Chọn SQL Editor từ thanh bên trái.
  • Nhìn vào phía dưới cùng của ngăn bên phải cho: "Safe Updates" (rejects UPDATEs and DELETEs with no restrictions).
  • Bỏ chọn hộp kiểm và nhấp vào OK.

Lưu ý: Thay đổi này sẽ không có hiệu lực ngay lập tức. Bạn phải khởi động lại kết nối của mình. Đóng tab SQL hiện tại và kết nối lại với máy chủ để các cài đặt mới được tải lên.

Giải pháp 3: "Mẹo" sử dụng Khóa chính

Đôi khi bạn không thể thay đổi các biến hoặc cài đặt máy chủ. Trong những trường hợp này, bạn có thể vượt qua bước kiểm tra an toàn bằng cách thêm một tham chiếu khóa chính mà về mặt kỹ thuật không làm gì cả nhưng đáp ứng yêu cầu "sử dụng một khóa".

Nếu bảng của bạn sử dụng id tự động tăng, hãy thêm AND id > 0 vào truy vấn của bạn:

UPDATE products 
SET price = price * 1.05 
WHERE category = 'Software' 
AND id > 0;

Vì mọi hàng hợp lệ đều có ID lớn hơn 0, nên logic vẫn không đổi, nhưng bộ lọc bảo mật của cơ sở dữ liệu sẽ chấp nhận.

Các bước xác minh

Để đảm bảo các thay đổi của bạn có hiệu lực, hãy làm theo các bước sau:

  • Chạy một cập nhật thử nghiệm nhỏ trên một hàng duy nhất bằng một cột không phải là khóa.
  • Theo dõi Action Output ở cuối màn hình.
  • Dấu kiểm màu xanh lá cây với x row(s) affected nghĩa là bạn đã thành công.
  • Nếu lỗi 1175 vẫn còn, hãy xác minh rằng SET SQL_SAFE_UPDATES = 0; đã được chạy trong tab đang hoạt động, vì cài đặt sẽ bị mất nếu bạn chuyển cửa sổ.

Các phương pháp hay nhất cho cập nhật hàng loạt

Vô hiệu hóa chế độ an toàn cực kỳ hữu ích cho các thay đổi quy mô lớn, nhưng nó có nghĩa là bạn đang làm việc mà không có hàng rào bảo vệ. Hãy sử dụng những thói quen này để giữ an toàn:

  • Xem trước tác động của bạn: Luôn chạy lệnh SELECT với mệnh đề WHERE hoàn toàn giống hệt trước. Nếu bạn mong đợi 50 hàng nhưng thấy 50.000, bạn đã cứu mình khỏi một thảm họa.
  • Sử dụng Transactions (Giao dịch): Bọc logic của bạn trong một khối an toàn. Điều này cho phép bạn kiểm tra kết quả trước khi lưu chúng vĩnh viễn.

START TRANSACTION; UPDATE inventory SET stock = 0 WHERE expiration_date < NOW(); -- Kiểm tra kết quả... -- Thành công? Dùng: COMMIT; -- Lỗi? Dùng: ROLLBACK;

  
  - **Giữ các bản sao lưu:** Trước khi sửa đổi các bảng dữ liệu thực tế (production) lớn, hãy xuất một bản SQL dump nhanh. Việc khôi phục bản sao lưu nhanh hơn nhiều so với việc hoàn tác thủ công một bản cập nhật hàng loạt bị lỗi.

Related Error Notes