2014-09-11 115 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