SQL创建插入和更新表的触发器

时间:2016-03-01 21:10:06

标签: mysql database-trigger

我有三个表test_cases表,一个schedule表,一个aggregate_summary表

test_cases

 caseID | file_name
--------+-------------------------
      1 | Test 1
      2 | Test 2
      3 | Test 3

时间表

| scheduleID | caseID | schedule_time
+------------+--------+---------------------
|          1 |      1 | 2016-02-29 02:15:00
|          2 |      2 | 2016-02-29 12:00:00
|          3 |      3 | 2016-02-27 12:00:00
|          4 |      2 | 2016-02-25 07:26:00
|          5 |      1 | 2016-02-26 07:37:00
|          6 |      2 | 2016-02-27 07:39:00
|          7 |      2 | 2016-02-28 07:25:00
|          8 |      1 | 2016-02-29 08:38:00
|          9 |      2 | 2016-02-29 07:08:00

aggregate_summary,其中包含start_time和文件名以及其他字段

我想创建一个触发器,因此在安排测试后,它将schedule_time放入start_time(在aggregate_summary表上),并将file_name(从test_cases)放入aggregate_summary表的file_name字段中。

我无法正确理解语法:

CREATE TRIGGER OnScheduleInsert AFTER INSERT ON schedule FOR EACH ROW BEGIN INSERT INTO aggregate_summary (start_time) VALUES(NEW.schedule_time)
UPDATE aggregate_summary SET file_name=(SELECT file_name FROM test_cases WHERE NEW.caseID=test_cases.caseID) END;

1 个答案:

答案 0 :(得分:1)

要在触发器的主体中执行查询,必须用分号分隔。为了让您的MySQL客户端不将分号解释为CREATE TRIGGER语句的结尾,您可能首先需要将分隔符更改为分号以外的其他内容,然后再将其更改回来。

DELIMITER //
CREATE TRIGGER OnScheduleInsert
AFTER INSERT ON schedule
FOR EACH ROW
BEGIN
    INSERT INTO aggregate_summary (start_time) VALUES(NEW.schedule_time);
    UPDATE aggregate_summary SET file_name=(SELECT file_name FROM test_cases WHERE NEW.caseID=test_cases.caseID);
END//
DELIMITER ;

我不认为触发器的主体完全符合您的要求,但我担心我不清楚触发器的期望行为是什么。不过,至少它现在在语法上是有效的。