Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

1093 Lỗi trong bảng MySQL được chỉ định hai lần

MySQL không cho phép bạn CHỌN từ một bảng trong cùng một câu lệnh mà bạn CẬP NHẬT hoặc XÓA cùng bảng đó.

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

Có một giải pháp thay thế để thực hiện một loại truy vấn con kép đánh giá truy vấn con bên trong trước đó và lưu trữ kết quả trong một bảng tạm thời. Tuy nhiên, điều này sẽ không mang lại cho bạn những gì bạn muốn, bởi vì nó chỉ chạy truy vấn phụ một lần và nó sẽ tạo ra một giá trị duy nhất và gán giá trị đó cho tất cả các hàng của bạn ở đó 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

Có vẻ như bạn đang cố gắng gán giá trị tự động tăng dần cho các hàng mà bạn vô tình đặt giá trị 0. Bạn không thể sử dụng phương thức MAX (id) +1 mà không khóa bảng vì các phiên đồng thời khác có thể đang chèn hàng mới trong khi bạn đang làm việc đó. Vì vậy, đó là một điều kiện của cuộc đua.

Tuy nhiên, bạn có thể chèn lấp nguyên tử các giá trị tăng tự động bằng cách đặt cột này thành một khóa tự động tăng.

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

Các hàng có 0 không bắt đầu ở 43, nhưng chúng nhận các giá trị duy nhất. Lần chèn tiếp theo sẽ nhận được 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. Django đặt Công cụ lưu trữ &Bộ mã mặc định

  2. Làm thế nào để chuyển đổi số trong tuần thành ngày?

  3. MySQL IF ELSEIF trong truy vấn chọn

  4. đăng nhập bằng tên người dùng hoặc địa chỉ email trong php

  5. Chỉ trả lại hàng nếu giá trị không tồn tại