Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lỗi MySQL 1093 - Không thể chỉ định bảng đích để cập nhật trong mệnh đề FROM

Cập nhật:Câu trả lời này bao gồm phân loại lỗi chung. Để có câu trả lời cụ thể hơn về cách xử lý tốt nhất truy vấn chính xác của OP, vui lòng xem các câu trả lời khác cho câu hỏi này

Trong MySQL, bạn không thể sửa đổi cùng một bảng mà bạn sử dụng trong phần CHỌN.
Hành vi này được ghi lại tại:http://dev.mysql.com/doc/refman/5.6/en/update.html

Có thể bạn chỉ có thể tham gia vào bàn chơi của chính mình

Nếu logic đủ đơn giản để định hình lại truy vấn, hãy mất truy vấn con và nối bảng với chính nó, sử dụng các tiêu chí lựa chọn thích hợp. Điều này sẽ khiến MySQL coi bảng là hai thứ khác nhau, cho phép các thay đổi mang tính hủy diệt tiếp tục.

UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col

Ngoài ra, hãy thử lồng truy vấn con sâu hơn vào mệnh đề from ...

Nếu bạn thực sự cần truy vấn con, có một cách giải quyết, nhưng lý do là vì một số lý do, bao gồm cả hiệu suất:

UPDATE tbl SET col = (
  SELECT ... FROM (SELECT.... FROM) AS x);

Truy vấn con lồng nhau trong mệnh đề FROM tạo ra một bảng tạm thời ngầm định , vì vậy nó không được tính là cùng một bảng mà bạn đang cập nhật.

... nhưng hãy chú ý đến trình tối ưu hóa truy vấn

Tuy nhiên, hãy cẩn thận rằng từ MySQL 5.7 .6 và trở đi, trình tối ưu hóa có thể tối ưu hóa truy vấn con, và vẫn đưa ra lỗi cho bạn. May mắn thay, optimizer_switch biến có thể được sử dụng để tắt hành vi này; mặc dù tôi không thể khuyên bạn nên làm điều này như một biện pháp khắc phục ngắn hạn hoặc cho các nhiệm vụ nhỏ một lần.

SET optimizer_switch = 'derived_merge=off';

Cảm ơn Peter V. Mørch cho lời khuyên này trong các nhận xét.

Kỹ thuật ví dụ từ Baron Schwartz, được xuất bản ban đầu tại Nabble , được diễn giải và mở rộng tại đây.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm MySQL POW () - Nâng giá trị lên sức mạnh của giá trị khác

  2. Thay thế cho mysql_real_escape_string mà không cần kết nối với DB

  3. Làm cách nào để tạo cơ sở dữ liệu nhiều người thuê với cấu trúc bảng được chia sẻ?

  4. Cách hạn chế kết quả trong MySQL, PostgreSQL và SQLite

  5. Laravel Eloquent chọn tất cả các hàng có max create_at