您似乎想要創建一個函數的可更新視圖的等效項,您可以在該函數上使用INSERT
,UPDATE
或DELETE
。這不可能。
如果您提供了類似功能的界面,請提供數據修改功能。
或者,把你的功能變成一個視圖。允許他們使用WHERE
子句來限制視圖,而不是將參數傳遞給函數。然後使用視圖觸發器(PostgreSQL 9.1及更高版本)或規則(PostgreSQL 9.0及更低版本,如果可能,請勿在較新版本上使用)在視圖上啓用INSERT
,UPDATE
和DELETE
。請參閱CREATE TRIGGER
和CREATE RULE
。規則很棘手,因此首選使用視圖觸發器。
PostgreSQL非常巧妙地將過濾器向下推入視圖,所以SELECT * FROM some_view WHERE some_col = 4
通常不會掃描整個視圖然後對其進行過濾。它會將WHERE
子句「推」到視圖的查詢中並執行該查詢。所以如果你的觀點是SELECT * FROM some_table WHERE NOT is_archived
PostgreSQL實際上會執行相當於SELECT * FROM some_table WHERE (NOT is_archived) AND some_col = 4
的執行。正因爲如此,當查詢視圖的幾行與所有行時,您可以並經常獲得完全不同的查詢計劃。 There's an example of this in a post I wrote a while ago。
只是將您的函數包裝在視圖中將無法正常工作,除非它是一個STABLE
而不是IMMUTABLE
(因此可以內聯)的SQL函數。您最好從函數中提取SQL並基於相同的SQL創建視圖,而不是將其基於自身的函數。
如果你的函數參數沒有在簡單的WHERE
子句中使用,那麼它會變得更加複雜,因爲沒有辦法像在函數中那樣將參數傳遞到視圖中。您可以創建一個關於參數的所有可能值的視圖,然後對其進行過濾,但如果Pg seq掃描視圖,則可能會導致非常糟糕的性能。在這些更復雜的情況下,我想提供一個函數調用接口來進行修改。
對於將來的問題,如果你能顯示代碼和你的PostgreSQL版本,將不勝感激。例如,在這種情況下,您可能會顯示函數定義,您如何使用它以及您希望如何使用它。 –