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

1093 Fejl i MySQL-tabel er angivet to gange

MySQL tillader dig ikke at SELECT fra en tabel i den samme sætning, hvor du OPDATERE eller DELETE den samme tabel.

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

Der er en løsning at lave en slags dobbelt underforespørgsel som evaluerer den indre underforespørgsel tidligere, og gemmer resultatet i en midlertidig tabel. Dette vil dog ikke give dig, hvad du ønsker, fordi det kun kører under-underforespørgslen én gang, og det vil generere en enkelt værdi og tildele den til alle dine rækker, hvor 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 ser ud til, at du forsøger at tildele automatisk stigningsværdier til rækker, hvor du ved et uheld har indstillet værdien 0. Du kan ikke bruge MAX(id)+1-metoden uden at låse tabellen, fordi andre samtidige sessioner muligvis indsætter nye rækker mens du gør det. Så det er en race tilstand.

Men du kan udfylde auto-increment-værdier atomisk ved at gøre kolonnen til en auto-increment-nøgle.

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

Rækkerne med 0 starter ikke ved 43, men de modtager unikke værdier. Den næste indsættelse får id 43.



  1. Problemer med at tilføje rækker med JDBC og MySQL?

  2. Islands T-SQL Challenge

  3. Oracle Managed ODP.NET kan ikke finde tnsnames.ora

  4. MATCH MOD med flere kolonner i MySQL