#mysql #sql #triggers
#mysql #sql #триггеры
Вопрос:
У меня возникли проблемы при создании триггера MySQL (5.1), и я действительно не понимаю, что я здесь делаю не так. Вот код :
DELIMITER //
CREATE TRIGGER CheckSoftware BEFORE INSERT ON Software
FOR EACH ROW BEGIN
-- Uppercase the first letter
SET NEW.name = CONCAT(UPPER(SUBSTRING(NEW.name, 1, 1)), SUBSTRING(NEW.name, 2));
-- If price isn't round
IF NEW.price != TRUNCATE(NEW.price) THEN
IF NEW.price - TRUNCATE(NEW.price) <= 0.49 THEN
-- Sets it to xx.49
SET NEW.price = TRUNCATE(NEW.price) 0.49;
ELSIF (NEW.price - TRUNCATE(NEW.price)) <= 0.99 THEN
-- Sets it to xx.99
SET NEW.price = TRUNCATE(NEW.price) 0.99;
END IF;
END IF;
END;
//
DELIMITER ;
и что MySQL бросает мне в лицо :
ERROR 1064 (42000): 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 ') THEN
IF NEW.price - TRUNCATE(NEW.price) <= 0.49 THEN
' at line 7
Большое спасибо, что посмотрели на это!
Комментарии:
1.
TRUNCATE
Определенно ли допустимое имя функции вMySQL
, а не просто используется для очистки таблиц?2. Да, я нашел это в документе MySQL и протестировал его. Кроме того, первый вызов TRUNCATE(), похоже, не вызывает никаких проблем. Я попытался заменить второй вызов другими функциями (например, ROUND()) и все та же ошибка.
Ответ №1:
DELIMITER //
CREATE TRIGGER CheckSoftware BEFORE INSERT ON Software
FOR EACH ROW BEGIN
-- Uppercase the first letter
SET NEW.name = CONCAT(UPPER(SUBSTRING(NEW.name, 1, 1)), SUBSTRING(NEW.name, 2));
-- If price isn't round
IF NEW.price != TRUNCATE(NEW.price,2) THEN
IF NEW.price - TRUNCATE(NEW.price,2) <= 0.49 THEN
-- Sets it to xx.49
SET NEW.price = TRUNCATE(NEW.price,2) 0.49;
ELSIF (NEW.price - TRUNCATE(NEW.price,2)) <= 0.99 THEN
-- Sets it to xx.99
SET NEW.price = TRUNCATE(NEW.price,2) 0.99;
END IF;
END IF;
END;
//
DELIMITER ;
функция усечения использует два параметра!
Комментарии:
1. Большое спасибо, я это пропустил. Также заставило меня увидеть, что я хотел использовать FLOOR (), а не TRUNCATE ().
Ответ №2:
DELIMITER #
CREATE TRIGGER CheckSoftware BEFORE INSERT ON Software
FOR EACH ROW BEGIN
SET NEW.name = CONCAT(UPPER(SUBSTRING(NEW.name, 1, 1)), SUBSTRING(NEW.name, 2));
IF NEW.price != TRUNCATE(NEW.price) THEN
...
END IF;
END # -- end of create trigger
DELIMITER ;
РЕДАКТИРОВАТЬ — разница:
...
END; <----
# -- end of create trigger
DELIMITER ;
Комментарии:
1. Кроме использования # в качестве разделителя вместо //, я не вижу разницы.. Есть ли она? Кстати, использование # не решает мою проблему