SQL Error (1093): You can’t specify target table ‘menus_items’ for update in FROM clause
But why? Si estoy haciendo un insert!!
Os voy a comentar el motivo de mi sorpresa al encontrar el error y su preciosa solución.
Tengo una tabla con los diferentes campos del menus, en “menus_items”. La tabla tiene una clave primaria menu_item_id que es AUTO_INCREMENT (por lo tanto está omitida en el insert).
La tabla tiene los siguientes campos:
menu_item_id,
menu_id,
parent_menu_item_id,
`code`,
`name`
Quiero que cuando inserte una secuencia en la tabla, parent_menu_item_id sea el identificador menu_item_id resultado de una búsqueda en la misma tabla por código.
Es decir, resultado de la query:
(select menu_item_id from menus_items where code='core-system' limit 1)
Así que ejecuto mi insert molón:
INSERT INTO `menus_items` ( <p dir="ltr">menu_id,</p> <p dir="ltr">parent_menu_item_id,</p> <p dir="ltr">`code`,</p> <p dir="ltr">`name`</p> ) VALUES ( <p dir="ltr">1,</p> <p dir="ltr">(select menu_item_id from menus_items where code='core-system' limit 1), 'system-auth-users',</p> <p dir="ltr">'Usuarios'</p> ) );
ERROR!!
SQL Error (1093): You can’t specify target table ‘menus_items’ for update in FROM clause
Efectivamente, estoy buscando sobre una tabla en la cual estoy modificando. Si quisiera hacer una subquery a otra tabla no hay problema. Por ejemplo:
INSERT INTO `menus_items` ( <p dir="ltr">parent_menu_item_id,</p> <p dir="ltr">`code`,</p> <p dir="ltr">`name`</p> ) VALUES ( <p dir="ltr">(select menu_id from menus where code='BACKEND'),</p> <p dir="ltr">'system-auth-users',</p> <p dir="ltr">'Usuarios'</p> ) );
Pero al ser la misma tabla MySQL no lo permite.
¿Entonces?
Bien, como solución podemos hace uso de variables:
select @MENU_ITEM_ID:=menu_item_id from menus_items where code='core-system' LIMIT 1;
Y ahora haciendo uso de la variable:
INSERT INTO `menus_items` ( parent_menu_item_id, `code`, `name` ) VALUES ( @MENU_ITEM_ID, 'system-auth-users', 'Usuarios' );
OHHHH
Me encanta :))
Si es necesario más información, si no queda claro, o si no es lo que estabais buscando. Comentarlo para que pueda mejorarlo 😉
Un saludo!
Yo quiero hacer algo similar pero con un Delete.(El valor 10 es para probar, pero la idea es recibir un id y borrar la persona relacionada con el ese id de usuario de la tabla usuario)
DELETE FROM persona WHERE per_dni= (select P.per_dni from persona P,usuario U where P.per_dni = U.us_fk_dni && U.id_user =10);
You can’t specify target table ‘persona’ for update in FROM clause