Mysql
 sql >> база данни >  >> RDS >> Mysql

Грешка в MySQL 1093 - Не може да се посочи целева таблица за актуализиране в клауза FROM

Актуализация:Този отговор обхваща общата класификация на грешките. За по-конкретен отговор как най-добре да се справите с точната заявка на OP, моля, вижте други отговори на този въпрос

В MySQL не можете да модифицирате същата таблица, която използвате в частта SELECT.
Това поведение е документирано на:http://dev.mysql.com/doc/refman/5.6/en/update.html

Може би просто да присъедините масата към нея

Ако логиката е достатъчно проста, за да преоформите заявката, загубете подзаявката и присъединете таблицата към себе си, като използвате подходящи критерии за избор. Това ще накара MySQL да види таблицата като две различни неща, което ще позволи да продължат деструктивните промени.

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

Алтернативно, опитайте да вложите подзаявката по-дълбоко в клауза from ...

Ако абсолютно се нуждаете от подзаявката, има заобиколно решение, но това е грозно поради няколко причини, включително производителност:

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

Вложената подзаявка в клаузата FROM създава неявна временна таблица , така че не се брои за същата таблица, която актуализирате.

... но внимавайте за оптимизатора на заявки

Внимавайте обаче, че от MySQL 5.7 .6 и нататък, оптимизаторът може да оптимизира подзаявката и пак да ви даде грешката. За щастие, optimizer_switch променливата може да се използва за изключване на това поведение; въпреки че не бих могъл да препоръчам да правите това като нещо повече от краткосрочна корекция или за малки еднократни задачи.

SET optimizer_switch = 'derived_merge=off';

Благодарение на Peter V. Mørch за този съвет в коментарите.

Примерната техника е от Baron Schwartz, първоначално публикуван в Nabble , перифразиран и разширен тук.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Кой е най-добрият начин за съхраняване на медийни файлове в база данни?

  2. Как да получите броя на битовете в низ в MySQL – BIT_LENGTH()

  3. Как да архивирате/възстановявате MySQL/MariaDB и PostgreSQL с помощта на инструменти „Automysqlbackup“ и „Autopostgresqlbackup“

  4. Използвайте MySQL релационни бази данни във Fedora 12

  5. MySQL сравнение с нулева стойност