Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

1093 Kesalahan dalam tabel MySQL ditentukan dua kali

MySQL tidak mengizinkan Anda untuk MEMILIH dari tabel dalam pernyataan yang sama di mana Anda MEMPERBARUI atau MENGHAPUS tabel yang sama.

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

Ada solusi untuk melakukan semacam subquery ganda yang mengevaluasi subquery dalam sebelumnya, dan menyimpan hasilnya dalam tabel sementara. Namun, ini tidak akan memberi Anda apa yang Anda inginkan, karena hanya menjalankan sub-sub-kueri sekali, dan itu akan menghasilkan satu nilai dan menetapkannya ke semua baris Anda di mana 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

Sepertinya Anda mencoba menetapkan nilai peningkatan otomatis ke baris tempat Anda secara tidak sengaja menyetel nilai 0. Anda tidak dapat menggunakan metode MAX(id)+1 tanpa mengunci tabel, karena sesi bersamaan lainnya mungkin menyisipkan baris baru saat Anda melakukannya. Jadi ini adalah kondisi balapan.

Namun Anda dapat mengisi ulang nilai kenaikan otomatis secara atom dengan menjadikan kolom sebagai kunci kenaikan otomatis.

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

Baris dengan 0 tidak dimulai dari 43, tetapi menerima nilai unik. Sisipan berikutnya akan mendapatkan 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. Bagaimana cara membandingkan input ke data mysql dengan php/sql?

  2. Cara menghitung perbedaan antara dua tanggal dalam bulan di MySQL

  3. Impor database tunggal dari --all-databases dump

  4. Bagaimana cara mengetahui apakah tabel saya adalah MyISAM atau Innodb

  5. log4net logging error di database mysql logging