sql >> Base de Datos >  >> RDS >> Mysql

1093 El error en la tabla MySQL se especifica dos veces

MySQL no le permite SELECCIONAR de una tabla en la misma declaración donde ACTUALIZA o ELIMINA esa misma tabla.

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

Hay un solución para hacer una especie de doble subconsulta que evalúa la subconsulta interna anterior y almacena el resultado en una tabla temporal. Sin embargo, esto no le dará lo que quiere, porque solo ejecuta la sub-sub-consulta una vez, y generará un valor único y lo asignará a todas sus filas donde 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

Parece que está tratando de asignar valores de incremento automático a las filas en las que inadvertidamente estableció el valor 0. No puede usar el método MAX(id)+1 sin bloquear la tabla, porque otras sesiones simultáneas podrían estar insertando nuevas filas mientras lo haces. Así que es una condición de carrera.

Pero puede rellenar los valores de incremento automático de forma atómica haciendo que la columna sea una clave de incremento automático.

Demostración:

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

Las filas con 0 no comienzan en 43, pero reciben valores únicos. La siguiente inserción obtendrá el ID 43.