MySQL触发器到PostgreSQL触发器
我在MySQL中编写了一个触发器:MySQL触发器到PostgreSQL触发器,mysql,sql,postgresql,Mysql,Sql,Postgresql,我在MySQL中编写了一个触发器: 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( NE
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,因为Heroku针对MySQL的ClearDB选项需要一个使用触发器的计划,这需要花费大量的资金
我的问题是:我已经尝试了所有方法,如何让这个触发器在PostgreSQL中工作?在使用更新我的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();
“我什么都试过了”-你到底试过什么?@a_horse_,没有名字我试过在Postgres中创建这个相同的触发器,使用上面列出的相同信息,从
SET NEW.first_name…
到SET NEW.middle_name…
Postgres将其识别为有效语法,只作为一个触发器,但是当我尝试在我的应用程序中访问它时,我得到了很多未知函数
,然后将子字符串索引
切换到分割部分
,然后出现了一组全新的错误。赋值运算符是PL/pgSQL中的:=
,不设置
:谢谢@a_horse_和_no_的名字为我指引了正确的方向!你对类似问题的其他一些评论帮助很大!键的使用是为了让我的PostgreSQL数据库能够理解子字符串索引
和if
,以及其他函数。从那以后,只需稍微调整一下就可以正常工作了