MySQL的触发到PostgreSQL触发
问题描述:
我写成这样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中工作?
答
用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
“*我试着一切*“ - 你试过什么? – 2014-09-11 10:36:24
@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
赋值运算符在PL/pgSQL中是':=',而不是'SET':http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-ASSIGNMENT – 2014-09-12 11:25:23