Mysql
 sql >> Datenbank >  >> RDS >> Mysql

1093 Fehler in MySQL-Tabelle ist doppelt angegeben

MySQL erlaubt Ihnen nicht, aus einer Tabelle in derselben Anweisung auszuwählen, in der Sie dieselbe Tabelle UPDATE oder LÖSCHEN.

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

Es gibt einen Abhilfe um eine Art doppelte Unterabfrage durchzuführen die die innere Unterabfrage früher auswertet und das Ergebnis in einer temporären Tabelle speichert. Dies wird Ihnen jedoch nicht das bringen, was Sie wollen, da es die Sub-Sub-Abfrage nur einmal ausführt und einen einzelnen Wert generiert und allen Ihren Zeilen mit id =0 zuweist.

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

Es sieht so aus, als ob Sie versuchen, automatisch inkrementierende Werte Zeilen zuzuweisen, in denen Sie versehentlich den Wert 0 festgelegt haben. Sie können die MAX(id)+1-Methode nicht verwenden, ohne die Tabelle zu sperren, da andere gleichzeitige Sitzungen möglicherweise neue Zeilen einfügen während du es tust. Es handelt sich also um eine Race-Condition.

Aber Sie können Auto-Increment-Werte atomar auffüllen, indem Sie die Spalte zu einem Auto-Increment-Schlüssel machen.

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

Die Zeilen mit 0 beginnen nicht bei 43, aber sie erhalten eindeutige Werte. Die nächste Einfügung erhält die ID 43.