簡體   English   中英

SQL 事件 - 更新其他表后刪除和更新表上的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM