2011-04-22 65 views
0

我在创建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'中绝对是一个有效的函数名称,而不只是用于清空表? – 2011-04-22 16:45:38

+0

是的,我在MySQL文档中找到它,并对其进行测试。另外,第一次调用TRUNCATE()似乎不会造成任何麻烦。我尝试用其他函数(如ROUND())替换第二个调用,并且仍然出现相同的错误。 – ksol 2011-04-22 16:47:48

回答

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 ; 

截断功能使用两个参数!

+0

非常感谢,我错过了。也让我看到我想用的是FLOOR(),而不是TRUNCATE()。 – ksol 2011-04-22 16:57:24

-1
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 ; 
+0

除了使用#作为分隔符代替//,我没有看到区别..有没有?顺便说一句,使用#不能解决我的问题 – ksol 2011-04-22 16:52:40