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

1093 Грешка в MySQL таблицата е посочена два пъти

MySQL не ви позволява да ИЗБИРАТЕ от таблица в същата инструкция, в която АКТУАЛИЗИРАТЕ или ИЗТРИВАТЕ същата таблица.

mysql> UPDATE ch_15_posts SET ID = (select MAX(ID)+1 as max FROM `ch_15_posts`) where id = 0;
ERROR 1093 (HY000): You can't specify target table 'ch_15_posts' for update in FROM clause

Има заобиколно решение за да направите нещо като двойна подзаявка която оценява вътрешната подзаявка по-рано и съхранява резултата във временна таблица. Това обаче няма да ви даде това, което искате, защото изпълнява подзаявката само веднъж и ще генерира една стойност и ще я присвои на всичките ви редове, където id =0.

mysql> UPDATE ch_15_posts SET ID = (select max from (select MAX(ID)+1 as max FROM `ch_15_posts`) t) where id = 0;
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3  Changed: 3  Warnings: 0

Изглежда, че се опитвате да присвоите автоматично увеличаващи се стойности на редове, където по невнимание сте задали стойността 0. Не можете да използвате метода MAX(id)+1, без да заключите таблицата, защото други едновременни сесии може да вмъкват нови редове докато го правиш. Така че това е състезателно условие.

Но можете да запълвате стойностите за автоматично увеличение атомарно, като направите колоната ключ за автоматично увеличение.

Демо:

mysql> create table c_15_posts (id int );

mysql> insert into c_15_posts values (0), (2), (0), (6), (0), (42);
Query OK, 6 rows affected (0.02 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> alter table c_15_posts modify id int auto_increment primary key;
Query OK, 6 rows affected (0.04 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from c_15_posts;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  6 |
|  7 |
| 42 |
+----+

Редовете с 0 не започват от 43, но получават уникални стойности. Следващото вмъкване ще получи идентификатор 43.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Премахнете единичните кавички от where_in в codeigniter

  2. MySQL GROUP BY и попълване на празни редове

  3. SQL заявка за извършване на търсене в радиус въз основа на географска ширина и дължина

  4. Използване на Mysql в командния ред в osx - командата не е намерена?

  5. Външни ключове и NULL в mySQL