2014-10-20 29 views
1

我一直在關注如何爲自動更新創建觸發器的PostgreSQL文檔(http://www.postgresql.org/docs/9.3/static/textsearch-features.html)。我一直在使用的例子如下:爲自動更新創建PostgreSQL觸發器。錯誤:列不是字符類型

CREATE TABLE messages (
    title  text, 
    body  text, 
    tsv   tsvector 
); 

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE 
ON messages FOR EACH ROW EXECUTE PROCEDURE 
tsvector_update_trigger(tsv, 'pg_catalog.english', title, body); 

而且一切都很好。

當我聲明身柱是象這樣的陣列產生的問題是:

CREATE TABLE messages (
    title  text, 
    body  text[], 
    tsv   tsvector 
    );  

然後我得到下面的錯誤消息上執行上述觸發命令我已經更新的字段之後:

ERROR: column "body" is not of a character type. 

我可以使用下面的命令手動更新表:

UPDATE messages SET tsv = to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body::text,'')); 

我試圖在觸發命令中使用body::text將主體列聲明爲數組。但是,這不起作用。

感謝您的幫助。

+0

哪裏是'tsvector_update_trigger'代碼? – Houari 2014-10-20 17:05:01

回答

0

我想這裏的錯誤是,你的tsvector_update_trigger函數不接受text[],但預計text來代替。所以,如果你要先更新函數,那麼你就可以更新表格,這一切都可以工作。

0

我看到這是一個老問題,但對於寫自己的觸發器在doc 12.4.3. Triggers for Automatic Updates一個例子:

CREATE FUNCTION messages_trigger() RETURNS trigger AS $$ 
begin 
    new.tsv := 
    setweight(to_tsvector('pg_catalog.english', coalesce(new.title,'')), 'A') || 
    setweight(to_tsvector('pg_catalog.english', coalesce(new.body,'')), 'D'); 
    return new; 
end 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE 
    ON messages FOR EACH ROW EXECUTE PROCEDURE messages_trigger();