Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL触发器到PostgreSQL触发器_Mysql_Sql_Postgresql - Fatal编程技术网

MySQL触发器到PostgreSQL触发器

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

我在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( 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
,以及其他函数。从那以后,只需稍微调整一下就可以正常工作了