MySQL - Error 1442 al actualizar el status en un trigger

 
Vista:
sin imagen de perfil

Error 1442 al actualizar el status en un trigger

Publicado por Rafa (8 intervenciones) el 08/06/2017 23:16:27
Estoy tratando de actualizar el status desde la tabla almacén hacia la tabla salida
cuando inserto un nuevo registro en la tabla salida ni status es=N y me actualiza el stock en almacén pero después de eso quiero que con trigger me actualice el status de salida a=R de registrado

Pero me sale este error cuando inserto uno nuevo
Ayuda por favor

#1442 - Can't update table 'salida' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.


este es mi código


CREATE TRIGGER ACTUALISA_STATUS AFTER INSERT ON almacen FOR EACH ROW

BEGIN
UPDATE salida SET status='R' WHERE status='N';

END
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Error 1442 al actualizar el status en un trigger

Publicado por leonardo_josue (414 intervenciones) el 09/06/2017 16:05:32
Hola Rafa:

No sé si eres compañero de clase de Ronaldo o si estarás en la misma escuela, porque ayer contesté exactamente lo mismo en otro post:

http://www.lawebdelprogramador.com/foros/MySQL/1607742-ERROR-1442.html

De entrada te comento que es imposible que a ti te esté marcando el problema que mencionas dado que no haces referencia a la misma tabla...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> DELIMITER $$
mysql> CREATE
    ->     TRIGGER `pruebas`.`Actualiza_status` AFTER INSERT
    ->     ON `pruebas`.`Almacen`
    ->     FOR EACH ROW BEGIN
    ->       UPDATE salida SET STATUS='R' WHERE STATUS='N';
    ->     END$$
Query OK, 0 rows affected (0.11 sec)
 
mysql> DELIMITER ;
mysql> SELECT * FROM salida;
+------+--------+
| id   | status |
+------+--------+
|    1 | N      |
|    2 | R      |
+------+--------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM almacen;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
+------+-------------+
1 row in set (0.00 sec)

Entonces, al insertar un nuevo registro en la tabla ALMACEN, se actualiza el campo status de la tabla SALIDA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> INSERT INTO almacen VALUES (1, 'DOS');
Query OK, 1 row affected (0.08 sec)
 
mysql> SELECT * FROM almacen;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    1 | DOS         |
+------+-------------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM salida;
+------+--------+
| id   | status |
+------+--------+
|    1 | R      |
|    2 | R      |
+------+--------+
2 rows in set (0.00 sec)

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error 1442 al actualizar el status en un trigger

Publicado por Rafa (8 intervenciones) el 09/06/2017 18:47:13
Hola Leo, gracias por contestar y creo que tenemos el mismo proyecto jajja, me a servido tu información

Pero al ahora de insertar un registro nuevo en la tabla salida me marca error todavía

#1242 - Subconsulta retorna mas que 1 línea

Estaría muy agradecido si me ayudaras
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Error 1442 al actualizar el status en un trigger

Publicado por leonardo_josue (414 intervenciones) el 09/06/2017 19:56:14
Hola de nuevo Rafa:

Esto que preguntas es distinto a la pregunta original, por lo tanto no es correcto "continuar" con un post o agregar preguntas nuevas que no tengan que ver con la pregunta original. Lo que debes hacer es dar por cerrado este post y abrir uno nuevo. Ojo para la siguiente:

En cuanto al error que comentas, no nos pones tu propio código (o el código de Ronaldo, si es que estás "reutilizando" lo que el hizo, sin embargo, este error suele suceder cuando haces este tipo de cosas:

1
2
3
...
campo = (SELECT campo FROM tabla WHERE condición)
...

Cuando utilizas el operador de igualación (=) entonces DEBES DE ASEGURARTE QUE EL RESULTADO DE LA SUBCONSULTA REGRESE UNO 1 SOLO UN VALOR... El error que te marca es claro al decir que la subconsulta está regresando MAS DE UN REGISTRO, por lo tanto NO PUEDE APLICARSE EL OPERADOR (=).

aquí va un ejemplo:

imagina que tienes esta tabla:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tabla;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    1 | one         |
|    1 | un          |
|    2 | dos         |
|    2 | two         |
|    2 | deux        |
+------+-------------+
6 rows in set (0.00 sec)

imagina que haces una subconsulta que te indique todos los números que comiencen con 'UN', entonces tienes esto:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT id
    -> FROM tabla
    -> WHERE descripcion LIKE 'un%';
+------+
| id   |
+------+
|    1 |
|    1 |
+------+
2 rows in set (0.00 sec)

entonces, si haces una consulta con (=) utilizando la subconsulta anterior ocurre el error que comentas:

1
2
3
4
5
6
mysql> SELECT *
    -> FROM tabla
    -> WHERE id = (SELECT id
    ->             FROM tabla
    ->             WHERE descripcion LIKE 'un%');
ERROR 1242 (21000): Subquery returns more than 1 row

Entonces, tienes de varias sopas:

1. Como dije, una es asegurarte que la subconsulta REGRESE 1 Y SÓLO UN VALOR, ya sea agregando el operador DISTINCT, agregando condiciones al WHERE o en su defecto utilizando el operador LIMIT 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> SELECT DISTINCT id
    -> FROM tabla
    -> WHERE descripcion LIKE 'un%';
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
 
mysql> SELECT id
    -> FROM tabla
    -> WHERE descripcion LIKE 'un%' AND descripcion != 'un';
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
 
mysql> SELECT id
    -> FROM tabla
    -> WHERE descripcion LIKE 'un%' LIMIT 1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

2. Cambias el operador = por el un operador IN el cual sirve para comparaciones Múltiples:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT *
    -> FROM tabla
    -> WHERE id IN (SELECT id
    ->              FROM tabla
    ->              WHERE descripcion LIKE 'un%');
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    1 | one         |
|    1 | un          |
+------+-------------+
3 rows in set (0.00 sec)


Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error 1442 al actualizar el status en un trigger

Publicado por Ronaldo (8 intervenciones) el 09/06/2017 21:50:06
gracias LEO, me a servido mucho
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar