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

Mysql SQL事件-更新其他表后删除和更新表上的行,mysql,sql,Mysql,Sql,我希望有一个棘手的SQL语句作为每隔几分钟运行一次的事件 目前,我正在使用Java来实现这一点,使用3个单独的语句在事务连接中执行顺序性 问:如果没有Java,我不知道如何构造这样一个SQL语句。如果不可能只有一条SQL语句,我希望使用transaction(就像我在Java中使用的那样)并在这些单独语句中出现故障时回滚 我的案例: 我有三个表:“工厂””、“计划””、“机器””。 我想做以下几件事: 1. WHERE Machines.annualCheck == "TRUE" SET Mac

我希望有一个棘手的SQL语句作为每隔几分钟运行一次的事件

目前,我正在使用Java来实现这一点,使用3个单独的语句在事务连接中执行顺序性

问:如果没有Java,我不知道如何构造这样一个SQL语句。如果不可能只有一条SQL语句,我希望使用transaction(就像我在Java中使用的那样)并在这些单独语句中出现故障时回滚

我的案例: 我有三个表:“
工厂”
”、“
计划”
”、“
机器”
”。 我想做以下几件事:

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
p、 我正在使用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)

我不知道为什么,但是我遇到了一个接一个的语法错误。
这是我第一次使用过程和分隔符。我做得对吗?

您可以使用存储过程

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也可以在机器表上创建触发器,如下所示:

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\u ANNUAL\u CHECK'其中annualCheck='TRUE'

非常感谢。我以前从未使用过
过程。请看一下我上次的更新,然后告诉我,如果你看到我做错了什么?期待着你的回信,如果这个答案对你有帮助,请考虑投票:谢谢你,有几件事你可以看1。代码>在mysql中触发
&2
On DELETE CASCADE
我认为这些术语可能会对您有所帮助。您上次的select查询预计会返回多少记录?Simonare,假设大约100条。谢谢Kaushik。我来看看。在第一个块中,DELETE语句缺少分号。在第二个块上,您没有声明@m_id,@f_id.ex:
DECLARE@m_id INT