2014-09-02 128 views
0

如果这个问题已经被回答,我会先道歉,我试过搜索,但找不到这个特定的问题。我试图创建两个触发器,它们会在名为'keyword'的字段中查找特定的字符串模式,并用另一个替换它。我现在已经用了几个小时,没有留下任何头发。有人能告诉我我做错了什么吗?用REPLACE触发的MySQL语法错误()

DELIMITER $$ 
CREATE TRIGGER override_new_alias 
BEFORE INSERT ON url_alias 
Begin 
    set NEW.keyword = replace(NEW.keyword, "store-", "store/"); 
    set NEW.keyword = replace(NEW.keyword, "genre-", "genre/"); 
    set NEW.keyword = replace(NEW.keyword, "author-", "author/"); 
End$$ 
DELIMITER ; 


DELIMITER $$ 
CREATE TRIGGER override_edit_alias 
AFTER update ON url_alias 
Begin 
    set OLD.keyword = replace(OLD.keyword, "store-", "store/"); 
    set OLD.keyword = replace(OLD.keyword, "genre-", "genre/"); 
    set OLD.keyword = replace(OLD.keyword, "author-", "author/"); 
End$$ 
DELIMITER ; 

这是我得到.....

MySQL表示:文档的时间提前

#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 'Begin 
    set NEW.keyword = replace(NEW.keyword, "store-", "store/"); 
    set NEW.ke' at line 3 

感谢。

回答

1

第一个触发

你在第一个触发忘记FOR EACH ROW

DELIMITER $$ 
CREATE TRIGGER override_new_alias 
BEFORE INSERT ON url_alias 
FOR EACH ROW 
Begin 
    set NEW.keyword = replace(NEW.keyword, "store-", "store/"); 
    set NEW.keyword = replace(NEW.keyword, "genre-", "genre/"); 
    set NEW.keyword = replace(NEW.keyword, "author-", "author/"); 
End$$ 
DELIMITER ; 

第二个触发

请注意,由于一切都改变了列承诺你不能在一个替换的任何值更新后。即使AFTER UPDATE触发器编译,它也会在执行时失败。为什么?

根据the Book

MySQL Stored Procedure Programming

第11章第251第3款说以下内容:

BEFOREAFTER触发器之间最显著不同的是,在AFTER你不能修改要插入或更新的值--DML已执行,试图更改DML的内容为时已晚 将要做。