Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

1093 Erro na tabela MySQL é especificado duas vezes


O MySQL não permite que você SELECT de uma tabela na mesma instrução onde você UPDATE ou DELETE essa mesma tabela.
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

Há um solução alternativa para fazer uma espécie de subconsulta dupla que avalia a subconsulta interna anteriormente e armazena o resultado em uma tabela temporária. No entanto, isso não vai te dar o que você quer, porque ele só executa a sub-sub-consulta uma vez e vai gerar um único valor e atribuí-lo a todas as suas linhas onde 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

Parece que você está tentando atribuir valores de incremento automático a linhas nas quais você inadvertidamente definiu o valor 0. Você não pode usar o método MAX(id)+1 sem bloquear a tabela, porque outras sessões simultâneas podem estar inserindo novas linhas enquanto você está fazendo isso. Então é uma condição de corrida.

Mas você pode preencher valores de incremento automático atomicamente tornando a coluna uma chave de incremento automático.

Demonstração:
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 |
+----+

As linhas com 0 não começam em 43, mas recebem valores exclusivos. A próxima inserção terá o id 43.