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.