我有三个相互关联的 MYSQL 表,如下所示。
我目前正在将 dateofjob
存储两次,因为我不知道如何在触发器中创建表连接。目前我在标本详细信息表上使用此触发器
CREATE TRIGGER `NewAge_update` BEFORE UPDATE ON `Speciemn_Details`
FOR EACH ROW BEGIN
SET NEW.Due_Date = DATE_ADD(NEW.CastDate,INTERVAL NEW.Age DAY);
END
这工作得很好,但我希望能够从标本详细信息表中删除列 dateofjob
并从 Job_Details 表中计算 duedate
以节省我自己避免双重数据。
我必须将 job_details.ID
与 Test_Details.PARENTID
和 Test_Details.TESTID
与 specimen_details 结合起来。 TESTID
,我只是不知道如何在触发器内执行此操作。任何帮助将不胜感激
我已尝试尽可能详细,但如果需要更多信息,请问我
工作详情
+----+-----------+
| ID | dateofjob |
+----+-----------+
| 1 | 1/01/2015 |
| 2 | 1/01/2016 |
| 3 | 1/01/2017 |
+----+-----------+
测试详情
+----------+--------+--------------+
| ParentID | TestID | TestLocation |
+----------+--------+--------------+
| 2 | 2154 | Barn |
| 2 | 2155 | Barn |
| 1 | 8055 | Yard |
+----------+--------+--------------+
标本_详细信息
+--------+----------+---------+-----------+-----------+
| TestID | Specimen | TestAge | dateofjob | Duedate |
+--------+----------+---------+-----------+-----------+
| 2154 | A | 3 | 1/01/2016 | 4/01/2016 |
| 2154 | B | 8 | 1/01/2016 | 9/01/2016 |
| 8055 | A | 2 | 1/01/2015 | 3/01/2015 |
+--------+----------+---------+-----------+-----------+
最佳答案
触发器代码中的联接实际上与任何其他过程代码中的联接没有任何不同,只是您不能查询触发表,而是拥有 OLD
和 NEW
伪记录。如果我理解了你的描述,你想做类似的事情
CREATE TRIGGER `NewAge_update` BEFORE UPDATE ON `Specimen_Details`
FOR EACH ROW
BEGIN
DECLARE jobdate DATE;
SELECT dateofjob
INTO jobdate
FROM job_details j, test_details t
WHERE j.ID = t.ParentID
AND t.TestID = NEW.TestID;
SET NEW.Duedate = DATE_ADD(jobdate, INTERVAL NEW.TestAge DAY);
END;
(不要忘记触发器主体是过程性的,因此您不必在一条语句中完成所有操作。)
关于带连接的 Mysql 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35097743/