MySQL vám neumožňuje VÝBĚR z tabulky ve stejném příkazu, kde UPDATE nebo DELETE stejnou tabulku.
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
Existuje řešení provést jakýsi dvojitý dílčí dotaz který vyhodnotí vnitřní poddotaz dříve a uloží výsledek do dočasné tabulky. Tím však nezískáte to, co chcete, protože podřízený poddotaz spustí pouze jednou a vygeneruje jedinou hodnotu a přiřadí ji všem vašim řádkům, kde 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
Zdá se, že se pokoušíte přiřadit hodnoty automatického zvyšování k řádkům, kde jste nedopatřením nastavili hodnotu 0. Metodu MAX(id)+1 nelze použít bez uzamčení tabulky, protože jiné souběžné relace mohou vkládat nové řádky zatímco vy to děláte. Je to tedy podmínka závodu.
Hodnoty automatického přírůstku však můžete atomicky doplnit tak, že ze sloupce vytvoříte klíč automatického přírůstku.
Demo:
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 |
+----+
Řádky s 0 nezačínají na 43, ale dostávají jedinečné hodnoty. Další vložka bude mít ID 43.