gpt4 book ai didi

Mysql触发器多重统计

转载 作者:行者123 更新时间:2023-11-30 22:42:39 25 4
gpt4 key购买 nike

我有 3 个表:Venta、Factura、Producto。所以我试图创建一个 Trigeer,它在表“Factura”上插入值,并在插入 Venta 时更新“Producto”上的值。这是我的第一个触发器,我不知道我做错了什么,我想也许我不知道如何声明变量?。我将不胜感激。

  • 我已经按照我的理解修改了代码。现在我在 de UPDATE 指令所在的行上收到语法错误。顺便说一句,表格是:

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$$

最佳答案

几个问题立即突出...

在 MySQL 数字文字中,小数点字符必须是句点(点)而不是逗号。

  SET iva = neto / 0,19 ;
^

在 INSERT 触发器中,表中的列没有 OLD. 值。这仅在 UPDATE 或 DELETE 触发器中有效。

  SET prod_descuento = new.Cant_Prod_V - old.Cant_Prod_P;
^^^^

此外,请注意在 SQL 语句的上下文中具有相同名称的列和变量。当引用可能是变量或列时,MySQL 会将引用解析为对该列的引用。

关于Mysql触发器多重统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30687588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com