Mysql
 sql >> Database >  >> RDS >> Mysql

1093 L'errore nella tabella MySQL è specificato due volte

MySQL non ti consente di SELECT da una tabella nella stessa istruzione in cui AGGIORNA o ELIMINA quella stessa tabella.

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

C'è un soluzione alternativa per eseguire una sorta di doppia sottoquery che valuta in precedenza la sottoquery interna e memorizza il risultato in una tabella temporanea. Tuttavia, questo non ti darà ciò che desideri, perché esegue la sottoquery solo una volta e genererà un singolo valore e lo assegnerà a tutte le righe in cui 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

Sembra che tu stia tentando di assegnare valori di incremento automatico alle righe in cui hai inavvertitamente impostato il valore 0. Non puoi utilizzare il metodo MAX(id)+1 senza bloccare la tabella, perché altre sessioni simultanee potrebbero inserire nuove righe mentre lo fai. Quindi è una condizione di razza.

Ma puoi riempire i valori di incremento automatico in modo atomico trasformando la colonna in una chiave di incremento automatico.

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 |
+----+

Le righe con 0 non iniziano con 43, ma ricevono valori univoci. Il prossimo inserto riceverà l'ID 43.