2012-12-06 40 views
0

在我的模式中,我想要一個primaryID和一個SearchID。對於每個SearchID,它都是primaryID加上一些文本的開頭。我需要這看起來像這樣:PostgreSQL - 創建primaryID表的副本的規則

  • PrimaryID = 1
  • SearchID =搜索1

由於PrimaryID設置爲自動增量,我希望我可以使用PostgreSQL規則做以下(僞代碼)

IF PRIMARYID CHANGES 
{ 
SEARCHID = SEARCH(PRIMARYID) 
} 

這將希望在primaryID被更新並自動發生之後恰好發生。那麼,這是實現這一目標的最佳方式嗎?任何人都可以提供一個如何完成的例子嗎?

謝謝

+1

如果可以從primaryID派生,爲什麼要存儲該值?只需創建一個返回「計算」的搜索ID的視圖。我認爲更清潔。但是,如果您認爲必須存儲它,請使用觸發器而不是規則。 –

回答

1

我會利用「生成」列 - PostgreSQL的特殊功能。假設你的表名爲tbl和串行主鍵被命名爲tbl_id

CREATE FUNCTION search_id(t tbl) 
    RETURNS text STABLE LANGUAGE SQL AS 
$$ 
SELECT 'Search' || $1.tbl_id; 
$$; 

然後,您可以:

SELECT t.tbl_id, t.search_id FROM tbl t; 

表資格在牛逼 .search_id是需要在這種情況下。由於沒有找到search_id作爲表tbl的列,因此Postgres會尋找一個函數,接下來將參數tbl作爲參數。

實際上,t.search_id只是search_id(t)的語法變體,但使用起來非常直觀。