MySQL - (1442, "Can't update table '...' in stored function/trigger because it is already used

 
Vista:
sin imagen de perfil

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por Sebastian (8 intervenciones) el 25/09/2017 18:22:34
Hola a todos
necesito su ayuda

Lo que pasa es que tengo un problema tratando de crear un trigger
lo que quiero hacer es que cuando se inserte un nuevo valor, el trigger inserte la sumatoria de las otras columnas

1
2
CREATE TRIGGER `Suma` BEFORE INSERT ON `ingresos_ingreso`
 FOR EACH ROW UPDATE ingresos_ingreso SET total=SUM(`debito` + `efectivo` + `cheque`)

Pero cuando inserto algo, me sale este error
(1442, "Can't update table 'ingresos_ingreso' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.")

y no sé que estoy haciendo mal

Muchas Gracias de antemano
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
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por xve (1151 intervenciones) el 25/09/2017 20:29:03
Hola Sebastian, el problema es que has generado un trigger que actualice un campo en la misma tabla que estas haciendo el insert, pero antes del insert... por eso te da ese error... no es logico lo que le estas indicando!!!

En teoría tendrías que hacerlo en el mismo insert, no en un trigger!!
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

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por Sebastian (8 intervenciones) el 25/09/2017 21:12:39
Gracias por tu ayuda

Pero... como lo haría en el mismo insert?
Lo que me dices sería algo tal que así?
1
2
CREATE TRIGGER `Suma` AFTER INSERT ON `ingresos_ingreso`
 FOR EACH ROW UPDATE ingresos_ingreso SET total=SUM(`debito` + `efectivo` + `cheque`)

Sin embargo lo intenté hacerlo en otra tabla por separado pero aun no logro dar con el resultado
No sé si me puedas ayudar
Gracias
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
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por xve (1151 intervenciones) el 25/09/2017 21:32:13
No... lo que yo te digo, es que cuando tu haces el insert desde tu aplicación... es decir, el insert que ejecuta dicho trigger.
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

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por Sebastian (8 intervenciones) el 25/09/2017 21:36:03
Mmmm entonces tendría que activar el trigger con el mismo boton que guarda los campos?
Algo así quieres decir?
O dices que deberia poner insert en vez de update?
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: 98
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por Yamil Bracho (40 intervenciones) el 25/09/2017 21:38:01
Creo qu eno va el SUM. Seria algo como :

CREATE TRIGGER `Suma` AFTER INSERT ON `ingresos_ingreso`

FOR EACH ROW UPDATE ingresos_ingreso SET new.total= new.debito + new.efectivo + new.cheque
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

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por Sebastian (8 intervenciones) el 25/09/2017 21:40:41
Hola Yamil
Gracias por tu ayuda
Lo intenté así y me sale el mismo error
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

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por leonardo_josue (414 intervenciones) el 25/09/2017 22:12:30
Hola Sebastian:

En realidad, lo que puedes hacer es CALCULAR la suma ANTES DE HACER EL INSERT, de tal suerte que al insertarse vaya con el valor correcto y no tengas que hacer un UPDATE adicional... aquí un ejemplo:

primero creamos una tabla, una para los campos que quieres sumar y otro para guardar la suma:

1
2
3
4
5
6
mysql> CREATE TABLE tabla (
    ->   id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ->   campo1 INT,
    ->   campo2 INT,
    ->   suma INT);
Query OK, 0 rows affected (0.24 sec)

Ahora creamos un TRIGGER BEFORE INSERT, para asignarle al campo SUMA el resultado de la suma de los dos campos:

1
2
3
4
5
6
7
8
9
mysql> DELIMITER $$
mysql> CREATE
    ->     TRIGGER `pruebas`.`sumar_campos` BEFORE INSERT ON `pruebas`.`tabla`
    ->     FOR EACH ROW BEGIN
    ->       SET NEW.suma = NEW.campo1 + NEW.campo2;
    ->     END$$
Query OK, 0 rows affected (0.06 sec)
 
mysql> DELIMITER ;

Ahora, al insertar el registro, sólo necesitamos asignarle un valor a los campos 1 y 2 y el trigger automáticamente calculará la suma:

1
2
3
4
5
6
7
8
9
10
mysql> insert into tabla values (null, 2, 5, null);
Query OK, 1 row affected (0.06 sec)
 
mysql> select * from tabla;
+----+--------+--------+------+
| id | campo1 | campo2 | suma |
+----+--------+--------+------+
|  1 |      2 |      5 |    7 |
+----+--------+--------+------+
1 row in set (0.00 sec)

Ahora bien, aquí vale la pena hacer una observación, por normalización de tablas UN CAMPO QUE PUEDE SER CALCULADO NO SE DEBE ALMACENAR EN LA TABLA... en realidad este campo es completamente inútil.

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
1
Comentar
sin imagen de perfil

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por Sebastian (8 intervenciones) el 25/09/2017 22:29:19
Mushisimas Gracias Leo, Funcionó a la perfeccion
Tienes razón el campo es un poco inutil, pero lo que quiero hacer luego es sumar esa columna y lo unico que se me vino a la cabeza fue hacer eso
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

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por leonardo_josue (414 intervenciones) el 25/09/2017 22:57:24
Hola de nuevo Sebastian:

Me da gusto que te haya servido el código que te puse, pero volviendo a lo que te comentaba, por normalización de tablas, un campo calculado no se debe almacenar, ya que al hacer una consulta puedes realizar los cálculos que necesites... por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> CREATE TABLE tabla (
    ->   id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ->   campo1 INT,
    ->   campo2 INT);
Query OK, 0 rows affected (0.27 sec)
 
mysql> insert into tabla values (null, 2, 7), (null, 3, 6), (null, 4, 3);
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> select * from tabla;
+----+--------+--------+
| id | campo1 | campo2 |
+----+--------+--------+
|  1 |      2 |      7 |
|  2 |      3 |      6 |
|  3 |      4 |      3 |
+----+--------+--------+
3 rows in set (0.00 sec)

Una vez que tienes estos datos, entonces obtener la columna con la suma es bastante simple:

1
2
3
4
5
6
7
8
9
mysql> select id, campo1, campo2, campo1 + campo2 suma from tabla;
+----+--------+--------+------+
| id | campo1 | campo2 | suma |
+----+--------+--------+------+
|  1 |      2 |      7 |    9 |
|  2 |      3 |      6 |    9 |
|  3 |      4 |      3 |    7 |
+----+--------+--------+------+
3 rows in set (0.00 sec)

y si necesitas sumar la columna, entonces puedes hacer uso de las funciones de agrupación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select sum(campo1 + campo2) from tabla;
+----------------------+
| sum(campo1 + campo2) |
+----------------------+
|                   25 |
+----------------------+
1 row in set (0.00 sec)
 
mysql> select sum(campo1) + sum(campo2) from tabla;
+---------------------------+
| sum(campo1) + sum(campo2) |
+---------------------------+
|                        25 |
+---------------------------+
1 row in set (0.00 sec)

Tal como tienes tu código DEBES DE TENER MUCHO CUIDADO SI ACTUALIZAS ESE REGISTRO, ya que si fuera el caso entonces tendrías que volver a calcular el campo de la suma... esto implicaría tener otro TRIGGER BEFORE UPDATE para actualizar este valor... si no lo haces así, entonces te arriesgas a tener cálculos erróneos.

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

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por Sebastian (8 intervenciones) el 25/09/2017 23:40:19
Muchísimas Gracias de verdad Leo
Cuando hago una consulta sin guardarla en ningun lado, cómo hago para mostrarlo en pantalla en django?
Debería guardarlo en una variable pero cómo hago eso?
de casualidad tienes conocimiento en django?
y otra cosa que pena contigo
Si quiero restarle un valor a esa sumatoria, cómo se haria eso?
Que pena molestarte
Saludos
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

(1442, "Can't update table '...' in stored function/trigger because it is already used

Publicado por leonardo_josue (414 intervenciones) el 26/09/2017 15:12:41
Hola Sebastián.

Lamentablemente no trabajo con ese Framework, te sugiero que preguntes en el foro de Phyton, para ver si alguno de los expertos puede resolver tu pregunta.

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