Archivos Mensuales: enero 2013

SQL Error (1093): You can’t specify target table for update

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!


Anuncios