Событие SQL - УДАЛЕНИЕ И ОБНОВЛЕНИЕ строк в таблицах после ОБНОВЛЕНИЯ другой таблицы - PullRequest
0 голосов
/ 21 января 2019

Мне бы хотелось иметь сложный оператор SQL в качестве события, которое выполняется каждые пару минут.

В настоящее время я делаю это с Java, используя 3 отдельных оператора, которые выполняют последовательность в соединении транзакции.

В: Я не знаю, как создать такой оператор SQL без Java.Если невозможно иметь один оператор 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)

Я не знаю почему, но у меня встречаются синтаксические ошибки - одинза другим.Я впервые использую ПРОЦЕДУРУ и РАЗДЕЛИТЕЛЬ.Я правильно делаю?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Также можно создать триггер на столе 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'

0 голосов
/ 21 января 2019

Вы можете использовать хранимую процедуру

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...