MySql在插入、更新时触发

MySql在插入、更新时触发,mysql,triggers,Mysql,Triggers,我已经使用MySQL有一段时间了,但我对MySQL触发器完全陌生 我有这个数据库: 年月日,主键,通风孔int,焊接初始int; Achatshargesid int,主键,libelle varchar,prix int,jour date,forein键。 每次插入或更新我的表“Achatsharges”后,触发器应检查表“jours”中的“soldeinitial”值是否为空,然后使用以下公式进行更新: '类似于中最后一行的'jours.soldeinitial'的值 “jours”-Su

我已经使用MySQL有一段时间了,但我对MySQL触发器完全陌生

我有这个数据库:

年月日,主键,通风孔int,焊接初始int; Achatshargesid int,主键,libelle varchar,prix int,jour date,forein键。 每次插入或更新我的表“Achatsharges”后,触发器应检查表“jours”中的“soldeinitial”值是否为空,然后使用以下公式进行更新:

'类似于中最后一行的'jours.soldeinitial'的值 “jours”-Sumachatsharges.prix+jours.ventes”

这就是我尝试过的:

CREATE TRIGGER UpdateSolde
AFTER INSERT, UPDATE ON achatscharges
FOR EACH ROW
BEGIN
IF((SELECT jours.soldeinitial FROM jours WHERE jours.jour=New.jour) IS NULL) 
THEN
UPDATE jours SET jours.soldeinitial=((SELECT jours.soldeinitial FROM jours WHERE jours.soldeinitial IS NOT NULL ORDER BY jours.jour DESC LIMIT 1)-SUM(New.prix)+jours.ventes) WHERE jours.jour=New.jour);
END IF;
END
例如:

+------------+-------- +---------------------+
| jour       | ventes  | soldeinitial        | 
+------------+---------+---------------------+
| 11-09-2017 | 1500    | 3000                |
| 12-09-2017 | 2000    | (must be calculated)|
| 13-09-2017 | 4000    | (must be calculated)|
+------------+---------+---------------------+
+------------+-------- +---------------------+
| id | libelle  | prix | #jour           |
+------------+---------+---------------------+
| 1  | somthing | 300  | 12-09-2017          |
| 2  | somthing | 200  | 12-09-2017          |
| 3  | somthing | 800  | 13-09-2017          |
+------------+---------+---------------------+
after triggger insert or update in achatscharges :
i should have this result :
+------------+-------- +---------------------------+
| jour       | ventes  | soldeinitial              | 
+------------+---------+---------------------------+
| 11-09-2017 | 1500    | 3000                      |
| 12-09-2017 | 2000    | 4500 =(3000-(300+500)+2000|
| 13-09-2017 | 4000    | 7700 =4500-(800)+4000     |
+------------+---------+---------------------------+
请原谅我解释得不太清楚,这就是例子

+------------+-------- +-------------------------+
| jour       | ventes  | soldeinitial            | 
+------------+---------+-------------------------+
| 11-09-2017 | 1500    | 3000   manually         |
| 12-09-2017 | 2000    | 4500   calculated       |
| 13-09-2017 | 4000    | 7700   calculated       |
| 14-09-2017 | 3000    | *3000*   manually       |
| 15-09-2017 | 1500    | 3700 = *3000*-(800)+1500| the trigger doesn't work here the value still null
+------------+---------+-------------------------+
+------------+-------- +---------------------+
| id | libelle  | prix | #jour               |
+------------+---------+---------------------+
| 1  | somthing | 300  | 12-09-2017          |
| 2  | somthing | 200  | 12-09-2017          |
| 3  | somthing | 800  | 13-09-2017          |
| 4  | somthing | 800  | 15-09-2017          |
+------------+---------+---------------------+
希望能澄清我注意到的问题。

我使用了以下测试数据: 我创建了插入触发器,如下所示: 希望有帮助。更新触发器与此类似。

我使用过以下测试数据: 我创建了插入触发器,如下所示:
希望有帮助。更新触发器与此类似。

您确定要更新还是新行,需要插入?谢谢您的回答,我给了您一个示例,说明我想要更新的内容,还是新行,需要插入?谢谢您的回答,我给了您一个示例,说明了我想要的内容。我非常感谢您的工作很好!但是在这一行中还有更多的事情,如果存在,从jour中选择jour,其中jour=NEW.jour我想测试**soldeinitial**是否为空,然后进行计算;我设置了如果从jours中选择soldeinitial,其中Jourr=NEW.Jourr为NULL,但它不起作用?如果在NULL上进行测试,您将仅捕获2017-09-12的第一个插入,而不会捕获第二个插入。无论如何,正确的语法是如果存在,从jours中选择soldeinitial,其中Jourr=NEW.jourr和soldeinitial为NULL,那么…测试工作正常,当不为NULL时计算不会发生,但当我插入一个新的日期并在该日期后使用'soldeinitial=NULL'时,触发器不工作?非常感谢您的回答。编辑:当我插入soldeinitial not null的新jours行时,测试工作正常,计算不会发生,但当我插入soldeinitial=null的新jours行后,触发器不工作?当然,在插入一些Achatsharges之后,非常感谢您的回答。我可能不明白您的意思,但当您需要插入jours时,您可能需要另一个jours触发器,对吗?这一次可能是在插入之前,因为您希望更新NEW.soldeinitial作为该jour的公式。我非常感谢您的工作很好!但是在这一行中还有更多的事情,如果存在,从jour中选择jour,其中jour=NEW.jour我想测试**soldeinitial**是否为空,然后进行计算;我设置了如果从jours中选择soldeinitial,其中Jourr=NEW.Jourr为NULL,但它不起作用?如果在NULL上进行测试,您将仅捕获2017-09-12的第一个插入,而不会捕获第二个插入。无论如何,正确的语法是如果存在,从jours中选择soldeinitial,其中Jourr=NEW.jourr和soldeinitial为NULL,那么…测试工作正常,当不为NULL时计算不会发生,但当我插入一个新的日期并在该日期后使用'soldeinitial=NULL'时,触发器不工作?非常感谢您的回答。编辑:当我插入soldeinitial not null的新jours行时,测试工作正常,计算不会发生,但当我插入soldeinitial=null的新jours行后,触发器不工作?当然,在插入一些Achatsharges之后,非常感谢您的回答。我可能不明白您的意思,但当您需要插入jours时,您可能需要另一个jours触发器,对吗?这一次可能是在插入之前,因为您希望将NEW.soldeinitial更新为该jour的公式。
CREATE TABLE jours
    (`jour` DATE, `ventes` int, `soldeinitial` int)
;
CREATE TABLE achatscharges
    (`id` int, `libelle` varchar(8), `prix` int, `jour` DATE)
;

INSERT INTO jours
    (`jour`, `ventes`, `soldeinitial`)
VALUES
    ('2017-09-11', 1500, 3000),
    ('2017-09-12', 2000, null),
    ('2017-09-13', 4000, null)
;
DELIMITER //
DROP TRIGGER IF EXISTS InsertSolde//
CREATE TRIGGER InsertSolde
AFTER INSERT ON achatscharges
FOR EACH ROW
BEGIN
DECLARE l_previous INTEGER;
DECLARE l_sumprix INTEGER;
IF EXISTS(SELECT jour FROM jours WHERE jour = NEW.jour) 
THEN
SET l_previous = (SELECT soldeinitial FROM jours WHERE soldeinitial IS NOT NULL AND jour < NEW.jour ORDER BY jour DESC LIMIT 1);
SET l_sumprix = (SELECT SUM(prix) FROM achatscharges WHERE jour = NEW.jour GROUP BY jour);
UPDATE jours SET soldeinitial = l_previous-l_sumprix+ventes WHERE jour=New.jour;
END IF;
END //
DELIMITER ;
INSERT INTO achatscharges
    (`id`, `libelle`, `prix`, `jour`)
VALUES
    (1, 'somthing', 300, '2017-09-12');

SELECT * FROM jours;    

INSERT INTO achatscharges
    (`id`, `libelle`, `prix`, `jour`)
VALUES
    (2, 'somthing', 200, '2017-09-12');

SELECT * FROM jours;    

INSERT INTO achatscharges
    (`id`, `libelle`, `prix`, `jour`)
VALUES
    (3, 'somthing', 800, '2017-09-13')
;
SELECT * FROM jours;