2014-09-11 114 views
0

我写成这样MySQL中的触发器:MySQL的触发到PostgreSQL触发

DELIMITER $$ 

CREATE TRIGGER mytrigger 
BEFORE INSERT ON people 
FOR EACH ROW 
BEGIN 

    SET NEW.first_name = SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 1), ' ', -1); 

    SET NEW.last_name = SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 3), ' ', -1); 

    SET NEW.middle_name = IF(LENGTH(NEW.name) - LENGTH(REPLACE(NEW.name, ' ', ''))>1 
     ,SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 2), ' ', -1) 
     ,NULL); 

END$$ 

DELIMITER ; 

我切换到PostgreSQL,因为MySQL的Heroku的ClearDB选项需要一个计划耗资过多的资金使用触发器

我的问题是:我试过所有的东西,我怎么才能让这个触发器在PostgreSQL中工作?

+0

“*我试着一切*“ - 你试过什么? – 2014-09-11 10:36:24

+0

@a_horse_with_no_name我试着在Postgres中创建同样的触发器,使用上面列出的同样的信息从'SET NEW.first_name ...'到'SET NEW.middle_name ...'Postgres将这个语法看成是有效的语法触发器,但是当我尝试在我的应用程序中访问它时,我得到很多'unknown function',然后将'SUBSTRING_INDEX'切换到'SPLIT_PART',然后出现一组全新的错误。 – 2014-09-12 11:24:23

+0

赋值运算符在PL/pgSQL中是':=',而不是'SET':http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-ASSIGNMENT – 2014-09-12 11:25:23

回答

0

https://github.com/pornel/mysqlcompat更新我的PostgreSQL数据库后。我是能够成功地和正确地格式化了扳机看成这样:

的触发功能看起来像:

CREATE OR REPLACE FUNCTION name_split() 
    RETURNS trigger AS 
$BODY$BEGIN 
NEW.first_name := SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 1), ' ', -1); 
NEW.last_name := IF(LENGTH(NEW.name) - LENGTH(REPLACE(NEW.name, ' ', ''))>1 
     ,SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 3), ' ', -3) 
     ,SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 3), ' ', -2)); 
NEW.middle_name := IF(LENGTH(NEW.name) - LENGTH(REPLACE(NEW.name, ' ', ''))>1 
     ,SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 2), ' ', -2) 
     ,NULL); 
RETURN NEW; 
END;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

和实际触发写着:

CREATE TRIGGER split 
    BEFORE INSERT OR UPDATE 
    ON actors 
    FOR EACH ROW 
    EXECUTE PROCEDURE name_split(); 
+0

关键是使用https://github.com/pornel/mysqlcompat,所以我的PostgreSQL数据库可以理解'substring_index'和'if'等函数。从那里只需稍作调整即可正常工作 – 2014-09-16 11:31:34