Mysql SQL事件-更新其他表后删除和更新表上的行
我希望有一个棘手的SQL语句作为每隔几分钟运行一次的事件 目前,我正在使用Java来实现这一点,使用3个单独的语句在事务连接中执行顺序性 问:如果没有Java,我不知道如何构造这样一个SQL语句。如果不可能只有一条SQL语句,我希望使用transaction(就像我在Java中使用的那样)并在这些单独语句中出现故障时回滚 我的案例: 我有三个表:“Mysql SQL事件-更新其他表后删除和更新表上的行,mysql,sql,Mysql,Sql,我希望有一个棘手的SQL语句作为每隔几分钟运行一次的事件 目前,我正在使用Java来实现这一点,使用3个单独的语句在事务连接中执行顺序性 问:如果没有Java,我不知道如何构造这样一个SQL语句。如果不可能只有一条SQL语句,我希望使用transaction(就像我在Java中使用的那样)并在这些单独语句中出现故障时回滚 我的案例: 我有三个表:“工厂””、“计划””、“机器””。 我想做以下几件事: 1. WHERE Machines.annualCheck == "TRUE" SET Mac
工厂”
”、“计划”
”、“机器”
”。
我想做以下几件事:
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中触发
&2On DELETE CASCADE
我认为这些术语可能会对您有所帮助。您上次的select查询预计会返回多少记录?Simonare,假设大约100条。谢谢Kaushik。我来看看。在第一个块中,DELETE语句缺少分号。在第二个块上,您没有声明@m_id,@f_id.ex:DECLARE@m_id INT代码>