SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.01.2022 17:28:27

Dmitrii
Участник
Зарегистрирован: 23.01.2022
Сообщений: 5

Помогите понять синтаксис создания триггера

Добрый день, начинаю свой путь в MySQL.  Использую Workbench.
Есть 3 таблицы:
таблица1 поля:id_bus, пробег, готовность.
таблица2 поля: Тип ТО, пробег(на момент то, например 95000),  Код ТО(внешний ключ 3-й таблицы), id_bus
таблица3 поля : Код ТО,  периодичность (например 10000).
Что я хочу:
При обновлении строки таблицы1 проверять :
Нужно взять сумму 2-х полей из 2-х других таблиц и сравнить со значением в обновляемой строке,
в зависимости от результата, полю "Готовность" обновляемой строки присвоить либо 1 либо 0

Триггер хочу поставить после обновления таблицы1:
DROP TRIGGER IF EXISTS `mydbftest`.`buses_BEFORE_UPDATE`;

DELIMITER $$
USE `mydbftest`$$
CREATE DEFINER = CURRENT_USER TRIGGER `mydbftest`.`buses_BEFORE_UPDATE` BEFORE UPDATE ON `buses` FOR EACH ROW
BEGIN
declare sumP int;
sumP = ((select историято.пробег from историято where историято.id_bus = NEW.id_bus)+
(select категориито.периодичность  from категориито.Код ТО =(select историято.Код ТО from историято
where историято.id_bus = NEW.id_bus)))
if sumP >NEW.пробег then  NEW.готовность = 1
else NEW.готовность = 0;
end if
END$$
DELIMITER ;

На это получаю ошибку - проверьте синтаксис. "ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= ((select историято.пробег from историято where истÐ' at line 4"
версия mysql 8,0,28

Собственно вопрос: Что я делаю не так? где можно прочитать/посмотреть как делать правильно ?

P.S. Ссаными тряпками прошу не кидать, триггер первый в жизни, с sql работал очень давно.

Отредактированно Dmitrii (23.01.2022 17:32:40)

Неактивен

 

#2 24.01.2022 01:03:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5777

Re: Помогите понять синтаксис создания триггера

1. Нужно использовать SET для присвоения
SET sumP = ..
SET NEW.готовность = 1
SET NEW.готовность = 0

2. Что означает конструкция  "from категориито.Код ТО"
Подозреваю, что речь о " from категориито where `Код ТО`"

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

3. Пропущено несколько ;

Рабочий вариант https://dbfiddle.uk/?rdbms=mysql_8.0&am … 9fabc9809f

Неактивен

 

#3 24.01.2022 12:25:54

Dmitrii
Участник
Зарегистрирован: 23.01.2022
Сообщений: 5

Re: Помогите понять синтаксис создания триггера

"2. Что означает конструкция  "from категориито.Код ТО"
Подозреваю, что речь о " from категориито where `Код ТО`""
Да, именно так, копировал 2 раза, потерял часть кода.

Большое спасибо за помощь и за очень полезную ссылку !

Неактивен

 

#4 24.01.2022 17:13:53

Dmitrii
Участник
Зарегистрирован: 23.01.2022
Сообщений: 5

Re: Помогите понять синтаксис создания триггера

Здравствуйте
Возник вопрос, а как можно сравнить несколько значений между собой ?
например в таблице1 нужное поле  currenmileage = 50000
в результате запроса
select TOHistory.Mileage + TechnicalOperations.ChangeInterval as SUM, TOHistory.TechnicalOperationsID as ID from TOHistory
JOIN
TechnicalOperations ON TechnicalOperations.id_Operation = TOHistory.TechnicalOperationsID
where TOHistory.idBuses = NEW.idBuses 
я получаю
SUM       IDTO
20000    1
50000    2
90000    3
мне нужно сравнить currenmileg c каждой строкой результата, причем их может быть 1 или 2 или 3
и в зависимости от результата сделать действие.
Уточню, мне нужно обработать результат сравнения с каждой строкой отдельно, и учесть что её может и не быть.
Например currenmileage > SUM для IDTO = 2.
Есть в SQL конструкции типа  циклов foreach  ? или что то вроде while( not eof   )?

Отредактированно Dmitrii (24.01.2022 17:20:31)

Неактивен

 

#5 25.01.2022 06:27:56

Dmitrii
Участник
Зарегистрирован: 23.01.2022
Сообщений: 5

Re: Помогите понять синтаксис создания триггера

Нашёл такое решение :
select SUM from
(select TOHistory.Mileage + TechnicalOperations.ChangeInterval as SUM, TOHistory.TechnicalOperationsID as ID from TOHistory
JOIN
TechnicalOperations ON TechnicalOperations.id_Operation = TOHistory.TechnicalOperationsID
where TOHistory.idBuses =1 ) as SM  where ID =1;
{Обработка результата}
select SUM from
(select TOHistory.Mileage + TechnicalOperations.ChangeInterval as SUM, TOHistory.TechnicalOperationsID as ID from TOHistory
JOIN
TechnicalOperations ON TechnicalOperations.id_Operation = TOHistory.TechnicalOperationsID
where TOHistory.idBuses =1 ) as SM  where ID =2;
{Обработка результата}
select SUM from
(select TOHistory.Mileage + TechnicalOperations.ChangeInterval as SUM, TOHistory.TechnicalOperationsID as ID from TOHistory
JOIN
TechnicalOperations ON TechnicalOperations.id_Operation = TOHistory.TechnicalOperationsID
where TOHistory.idBuses =1 ) as SM  where ID =3;
{Обработка результата}

Вопрос - нет чего либо более оптимального ? Не будет проблем с быстродействием ?

Неактивен

 

#6 25.01.2022 07:45:59

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5777

Re: Помогите понять синтаксис создания триггера

Решение плохое, вы трижды выполняете один и тот же запрос.

Обычно результат запроса обрабатывается в яп, на котором вы пишите, и с каждой полученной строкой выполняются нужные действия.
Можно и на mysql написать хранимую процедуру, в них есть циклы, см https://dev.mysql.com/doc/refman/8.0/en … ments.html

Неактивен

 

#7 25.01.2022 18:03:22

Dmitrii
Участник
Зарегистрирован: 23.01.2022
Сообщений: 5

Re: Помогите понять синтаксис создания триггера

Да я по этому и спрашиваю про более оптимальное решение. Во внешнем то проблем нет, нужно именно внутри БД.
Циклы в SQL  предполагают только вызов запросов в цикле, что мне не подходит.
по этому добавил условие проверки и лимит на 1 запись. Подробности буду проверять во внешней программе, по вашему совету.
Благодарю за подсказки.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson