Mysql
 sql >> Baza danych >  >> RDS >> Mysql

1093 Błąd w tabeli MySQL podano dwukrotnie

MySQL nie pozwala na WYBIERANIE z tabeli w tej samej instrukcji, w której UPDATE lub DELETE tę samą 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

Istnieje obejście zrobić coś w rodzaju podwójnego podzapytania który oblicza wewnętrzne podzapytanie wcześniej i przechowuje wynik w tabeli tymczasowej. Jednak to nie zapewni Ci tego, czego chcesz, ponieważ uruchamia podzapytanie tylko raz i wygeneruje pojedynczą wartość i przypisze ją do wszystkich Twoich wierszy, w których 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

Wygląda na to, że próbujesz przypisać wartości automatycznego zwiększania do wierszy, w których przypadkowo ustawiłeś wartość 0. Nie możesz użyć metody MAX(id)+1 bez zablokowania tabeli, ponieważ inne współbieżne sesje mogą wstawiać nowe wiersze kiedy to robisz. Więc to jest sytuacja wyścigowa.

Ale możesz uzupełnić wartości automatycznie zwiększające się automatycznie, czyniąc kolumnę kluczem automatycznego zwiększania.

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

Wiersze z 0 nie zaczynają się od 43, ale otrzymują unikalne wartości. Następna wstawka otrzyma id 43.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql_real_escape_string() Ostrzeżenie zamieszanie

  2. mysql to tablica w wielu kolumnach

  3. mysql recursive(drzewo) kategoria rodzic-dziecko

  4. Wysyłaj dane z javascriptu do bazy mysql

  5. MySQL sortuj według jakiejś listy