sql >> Database >  >> RDS >> Mysql

1093 Fout in MySQL-tabel is twee keer opgegeven

MySQL staat je niet toe om te SELECTEREN uit een tabel in dezelfde instructie waar je diezelfde tabel BIJWERKT of VERWIJDERT.

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

Er is een oplossing om een ​​soort dubbele subquery te doen die de innerlijke subquery eerder evalueert en het resultaat opslaat in een tijdelijke tabel. Dit zal je echter niet opleveren wat je wilt, omdat het de sub-sub-query maar één keer uitvoert, en het zal een enkele waarde genereren en deze toewijzen aan al je rijen waar 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

Het lijkt erop dat u automatisch oplopende waarden probeert toe te wijzen aan rijen waar u per ongeluk de waarde 0 instelt. U kunt de MAX(id)+1-methode niet gebruiken zonder de tabel te vergrendelen, omdat andere gelijktijdige sessies mogelijk nieuwe rijen invoegen terwijl je het doet. Het is dus een raceconditie.

Maar u kunt waarden voor automatisch verhogen atomair aanvullen door van de kolom een ​​sleutel voor automatisch verhogen te maken.

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

De rijen met 0 beginnen niet bij 43, maar krijgen wel unieke waarden. De volgende invoeging krijgt id 43.



  1. Snelle MySQL-tip:de functie LENGTH en TRIM gebruiken

  2. mysql naar php naar xml toont lege leeftijd

  3. Wat zijn de voordelen van een datamanagementsysteem?

  4. PHP PDO invoegen met Loop