Mysql
 sql >> Base de données >  >> RDS >> Mysql

1093 L'erreur dans la table MySQL est spécifiée deux fois

MySQL ne vous permet pas de SELECT à partir d'une table dans la même instruction où vous mettez à jour ou supprimez cette même table.

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

Il y a un solution de contournement faire une sorte de double sous-requête qui évalue la sous-requête interne plus tôt et stocke le résultat dans une table temporaire. Cependant, cela ne vous donnera pas ce que vous voulez, car il n'exécute la sous-sous-requête qu'une seule fois, et il générera une seule valeur et l'affectera à toutes vos lignes où 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

Il semble que vous essayez d'attribuer des valeurs d'auto-incrémentation aux lignes où vous avez défini par inadvertance la valeur 0. Vous ne pouvez pas utiliser la méthode MAX(id)+1 sans verrouiller la table, car d'autres sessions simultanées peuvent insérer de nouvelles lignes pendant que vous le faites. C'est donc une condition de concurrence.

Mais vous pouvez remplir les valeurs d'auto-incrémentation de manière atomique en faisant de la colonne une clé d'auto-incrémentation.

Démo :

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

Les lignes avec 0 ne commencent pas à 43, mais elles reçoivent des valeurs uniques. La prochaine insertion obtiendra l'identifiant 43.