У меня есть 3 стола: Venta, Factura, Producto. Поэтому я пытаюсь создать Trigeer, который вставляет значения в таблицу «Factura» и удваивает значение «Producto» при вставке в Venta. Это мой первый триггер, и я не знаю, что я делаю неправильно, я думаю, может быть, я не понимаю, как объявлять переменные? Я буду признателен за любой свет.Mysql Trigger multiple stat
- Я изменил код, как я понял. Теперь я получаю синтаксическую ошибку в строке, это инструкция 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. Я буду продолжать смотреть. –
Хорошо, я получаю это. Я понял, что у меня есть значения, такие как «iva» и «neto», используя одно и то же имя имен столбцов. Теперь я получаю: «# 1235 - эта версия MySQL еще не поддерживает« несколько триггеров с одинаковым временем действия и событием для одной таблицы ». Я думаю, это потому, что я делаю INSERT и UPDATE в одном и том же триггере. Я поделюсь с вами, если найду решение. –
Эта ошибка означает, что триггер «ПЕРЕД НАЧАЛОМ» определен в таблице при попытке создать новый триггер «ПЕРЕД НАЧАЛОМ» в той же таблице. Прежде чем создавать новый, вам нужно отказаться от существующего. – spencer7593