[英]SQL Event - DELETE AND UPDATE rows on tables after UPDATE other table
我想要一個棘手的 SQL 語句作為每隔幾分鍾運行一次的事件。
目前,我正在使用 Java 這樣做,使用 3 個單獨的語句在事務連接中執行順序。
問:我不知道如何在沒有 Java 的情況下構建這樣的 SQL 語句。 如果不可能有一個單一的 SQL 語句,我想使用事務(就像我在 Java 中使用的那樣)和回滾,以防在任何這些單獨的語句中失敗。
我的案例:我有 3 個表:“ Factory
”、“ Plan
”、“ Machine
”。 我想做如下事情:
1.
WHERE Machines.annualCheck == "TRUE"
SET Machine.status = "IN_ANNUAL_CHECK"
For machines that got updated I need to do the following:
2.1 Update the related factory
WHERE Factory.id == Machine.linkFactoryID
UPDATE Factory.totalActiveMachines = --1
2.2 Delete the upcoming plans that planned to be handled by the related machine
DELETE rows WHERE Plan.willHandleByMachineID = Machine.ID
ps 我正在使用 MySQL
謝謝!
更新:
按照 Simonare 的建議,我厭倦了執行以下操作:
DELIMITER $
CREATE PROCEDURE annualCheck(IN Machine_ID int, IN Factory_ID int)
BEGIN
UPDATE machine_table
SET machine_table.annualCheck = 'IN_ANNUAL_CHECK'
WHERE machine_table.machine_id = Machine_ID;
UPDATE factory_table
SET factory_table.totalActiveMachines = factory_table.totalActiveMachines - 1
WHERE factory_table.factory_id = Factory_ID;
DELETE FROM plan_table WHERE plan_table.assign_to_machine = Machine_ID
END$
DELIMITER $$
BEGIN
SELECT @m_id = machine_id, @f_id = link_factory_id
FROM machine_table
WHERE machine_table.annualCheck = 'TRUE';
END$$
CALL annualCheck(@m_id,@f_id)
我不知道為什么,但我遇到了語法錯誤 - 一個接一個。 這是我第一次使用 PROCEDURE 和 DELIMITER。 我做得對嗎?
你可以使用存儲過程
delimiter //
CREATE PROCEDURE myProc (IN Machine_ID int)
BEGIN
UPDATE myTable
SET Machine.status = "IN_ANNUAL_CHECK"
WHERE Machines.annualCheck == "TRUE";
Update the related factory
WHERE Factory.id == Machine.linkFactoryID
UPDATE Factory.totalActiveMachines = totalActiveMachines -1;
DELETE FROM Plan WHERE Plan.willHandleByMachineID = Machine_ID;
END//
然后你可以從mysql執行它
CALL simpleproc(@a);
或來自 Java
也可以在 Machine 表上創建觸發器,如下所示:
CREATE TRIGGER `TRG_Machines_AfterUpdate` AFTER UPDATE ON `Machine` FOR EACH ROW BEGIN
IF OLD.annualCheck = 'TRUE' AND NEW.annualCheck = 'IN_ANNUAL_CHECK' THEN
UPDATE
Factory
SET
totalActiveMachines = totalActiveMachines - 1
WHERE
id = NEW.linkFactoryID
;
DELETE FROM
Plan
WHERE
willHandleByMachineID = NEW.ID
;
END;
END
所以你可以發布正常更新:
UPDATE Machine SET annualCheck = 'IN_ANNUAL_CHECK' WHERE annualCheck = 'TRUE'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.