我有3张桌子:Venta,Factura,Producto。因此,我正在尝试创建一个Trigeer,它在表“Factura”上插入值,并在插入Venta时在“Producto”上添加一个值。这是我的第一个触发器,我不知道我做错了什么,我想也许我不知道如何声明变量?我会对此表示赞赏。
mysql> describe Producto;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| Cod_Prod | varchar(8) | NO | PRI | NULL | |
| Nom_Prod_P | varchar(16) | NO | | NULL | |
| Precio_P | decimal(9,2) | NO | | NULL | |
| Cantidad_P | int(6) | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> describe Venta;
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id_Venta | varchar(9) | NO | PRI | NULL | |
| Fecha_V | date | NO | | NULL | |
| Nom_Cli_V | varchar(24) | NO | | NULL | |
| Rut_Cli_V | varchar(12) | NO | | NULL | |
| Dir_Cli_V | varchar(16) | NO | | NULL | |
| Nom_Prod_V | varchar(16) | NO | | NULL | |
| Precio_V | decimal(9,2) | NO | | NULL | |
| Cant_Prod_V | int(6) | NO | | NULL | |
| Forma_Pago_V | varchar(12) | NO | | NULL | |
+--------------+--------------+------+-----+---------+-------+
9 rows in set (0.00 sec)
mysql> describe Factura;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| Num_Fac | int(11) | NO | PRI | NULL | auto_increment |
| Fecha_F | date | NO | | NULL | |
| Nom_Cli_F | varchar(24) | NO | | NULL | |
| Rut_Cli_F | varchar(12) | NO | | NULL | |
| Dir_Cli_F | varchar(16) | NO | | NULL | |
| Nom_Prod_F | varchar(24) | NO | | NULL | |
| Cant_Prod_F | int(6) | NO | | NULL | |
| Neto | decimal(9,2) | NO | | NULL | |
| IVA | decimal(9,2) | NO | | NULL | |
| Total | decimal(9,2) | NO | | NULL | |
| Forma_Pago_F | varchar(12) | NO | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)
DELIMITER $$
CREATE TRIGGER Genera_Factura_Before
BEFORE INSERT
ON TuOficina.Venta
FOR EACH ROW
BEGIN
DECLARE calc_iva decimal(9,2);
DECLARE calc_neto decimal(9,2);
DECLARE gran_total decimal(9,2);
DECLARE prod_descuento int(6);
SET calc_neto = new.Precio_V * new.Cant_Prod_V;
SET calc_iva = calc_neto / 0.19;
SET gran_total = calc_neto + calc_iva;
SET prod_descuento = new.Cant_Prod_V - Cantidad_P;
INSERT INTO Factura(Fecha_F, Nom_Cli_F, Rut_Cli_F, Dir_Cli_F, Nom_Prod_F, Cant_Prod_F, Neto, IVA, Total, Forma_Pago_F) VALUES (Fecha_V, new.Nom_Cli_V, new.Rut_Cli_V, new.Dir_Cli_V, new.Nom_Prod_V, new.Cant_Prod_V, calc_neto, calc_iva, gran_total, new.Forma_Pago_V);
UPDATE Producto SET Cantidad_P = prod_descuento WHERE Nom_Prod_P = new.Nom_Prod_P;
END$$
答案 0 :(得分:0)
有几个问题立即脱颖而出......
在MySQL数字文字中,小数点字符必须是句点(点)而不是逗号。
SET iva = neto / 0,19 ;
^
在INSERT触发器中,表中的列没有OLD.
值。这仅在UPDATE或DELETE触发器中有效。
SET prod_descuento = new.Cant_Prod_V - old.Cant_Prod_P;
^^^^
另外,请注意SQL语句上下文中具有相同名称的列和变量。当可能的引用可能是变量或列时,MySQL会将引用解析为列。