sql >> Databasteknik >  >> RDS >> Mysql

1093 Fel i MySQL-tabellen anges två gånger

MySQL tillåter dig inte att VÄLJA från en tabell i samma programsats där du UPPDATERA eller DELETE samma tabell.

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

Det finns en lösning att göra en sorts dubbel underfråga som utvärderar den inre underfrågan tidigare, och lagrar resultatet i en temporär tabell. Detta kommer dock inte att ge dig vad du vill, eftersom det bara kör undersub-frågan en gång, och det kommer att generera ett enda värde och tilldela det till alla dina rader där 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

Det verkar som att du försöker tilldela automatiskt ökande värden till rader där du oavsiktligt ställt in värdet 0. Du kan inte använda metoden MAX(id)+1 utan att låsa tabellen, eftersom andra samtidiga sessioner kan infoga nya rader medan du gör det. Så det är ett racetillstånd.

Men du kan återfylla värden för automatisk ökning atomärt genom att göra kolumnen till en nyckel för automatisk ökning.

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

Raderna med 0 börjar inte vid 43, men de får unika värden. Nästa infogning får id 43.



  1. Felsökning av MySQL-replikering:Del ett

  2. Ta bort från en tabell med join

  3. Konvertera SQL2008 RDL-fil till SQL2005

  4. En biblioteksdatamodell