MySQL - Ayuda con este trigger pls

 
Vista:

Ayuda con este trigger pls

Publicado por Diego (4 intervenciones) el 25/05/2017 11:08:07
Estoy intentando hacer un trigger que me actualice el importe de las facturas al insertar un nuevo albaran:

1
2
3
4
5
6
7
8
9
delimiter $$
drop trigger if exists t1$$
create trigger t1 before insert on albaran
for each row
begin
update factura set importe=importe+new.cantidad*(select precio from articulo)
where cod_fac=new.cod_fact;
end$$
delimiter ;

Pero me da error 1452 de mysql al insertar el albaran, ayudenme diciendome por donde estoy fallando. Gracias
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

Ayuda con este trigger pls

Publicado por leonardo_josue (414 intervenciones) el 25/05/2017 16:26:32
Hola Diego:

el error que te está marcando, en realidad creo que no tiene que ver con el TRIGGER como tal, sino más bien con la forma en que estás realizando el INSERT y es debido a que de acuerdo al error, tu tabla albaran tiene una llave foránea hacia alguna otra tabla y el valor que estás tratando de ingresar NO EXISTE EN LA TABLA PADRE... aquí hay un ejemplo simple:

Creamos una tabla padre:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> CREATE TABLE padre (id_padre INT,
    ->                     descripcion VARCHAR(20),
    ->                     PRIMARY KEY (id_padre));
Query OK, 0 rows affected (0.30 sec)
 
mysql> INSERT INTO padre VALUES (1, 'padre 1'), (2, 'padre 2');
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM padre;
+----------+-------------+
| id_padre | descripcion |
+----------+-------------+
|        1 | padre 1     |
|        2 | padre 2     |
+----------+-------------+
2 rows in set (0.00 sec)

ahora creamos una tabla hija con una LLAVE FORÁNEA FK hacia la tabla padre:

1
2
3
4
5
6
mysql> CREATE TABLE hija (id_hija INT,
    ->                    id_padre INT,
    ->                    descripcion VARCHAR(20),
    ->                    PRIMARY KEY (id_hija),
    ->                    FOREIGN KEY (id_padre) REFERENCES padre (id_padre));
Query OK, 0 rows affected (0.30 sec)

Al tratar de insertar un registro en la tabla hija, PRIMERO SE VERIFICA QUE EXISTA LA LLAVE FORÁNEA EN LA TABLA PADRE:

1
2
3
4
5
6
7
8
9
10
mysql> INSERT INTO hija VALUES (1, 1, 'hija 1.1');
Query OK, 1 row affected (0.08 sec)
 
mysql> SELECT * FROM hija;
+---------+----------+-------------+
| id_hija | id_padre | descripcion |
+---------+----------+-------------+
|       1 |        1 | hija 1.1    |
+---------+----------+-------------+
1 row in set (0.00 sec)

Pero, cuando NO EXISTE LA LLAVE, marca el error que mencionas:

1
2
3
mysql> INSERT INTO hija VALUES (2, 3, 'hija 3.1');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
(`pruebas`.`hija`, CONSTRAINT `hija_ibfk_1` FOREIGN KEY (`id_padre`) REFERENCES `padre` (`id_padre`))

Aquí marca error, porque el id_padre = 3 NO EXISTE EN LA TABLA padre...

Asegúrate primero de que el INSERT se realice correctamente,

Ahora, pasando al TRIGGER, es posible que tengas un error en esta parte:

1
2
3
...
new.cantidad * (select precio from articulo)
...

Si la subconsulta REGRESA MÁS DE UN REGISTRO, debes de asegurarte que esta subconsulta regrese un 1 solo un precio, de lo contrario no funcionará el UPDATE.

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