Синтаксическая ошибка в триггере

#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. Кроме использования # в качестве разделителя вместо //, я не вижу разницы.. Есть ли она? Кстати, использование # не решает мою проблему