Postgresql

如何使用變數的值設置列 DEFAULT

  • June 5, 2019

在用於設置使用隨機 UUID 作為主鍵的數據庫的腳本中,我有:

CREATE TABLE alpha (id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), value INT);
CREATE TABLE beta (aref UUID REFERENCES alpha (id));

INSERT INTO alpha (value) VALUES (42);

然後通過外鍵,將“alpha”中的記錄作為插入“beta”表的預設目標:

DO $$
   DECLARE l_id UUID;
   BEGIN
       SELECT alpha.id FROM alpha INTO l_id;
       ALTER TABLE beta ALTER COLUMN aref SET DEFAULT l_id;
   END;
$$ LANGUAGE plpgsql;
ERROR:  column "l_id" does not exist
CONTEXT:  SQL statement "ALTER TABLE beta ALTER COLUMN aref SET DEFAULT l_id"
PL/pgSQL function inline_code_block line 1 at SQL statement

如何使用變數的值作為列的預設值?

您似乎假設對 SQL 實用程序命令(如)進行變數替換ALTER TABLE,但這並未實現。

也無法將實用程序命令的值傳遞EXECUTE給 plpgsql中的USING子句。

在有關 SO 的相關答案中對兩者的詳細解釋:

連接語句,然後執行它——就像@Abelisto 暗示的那樣。但是你不需要變數,你可以直接連接查找值:

DO $$
BEGIN
EXECUTE format('ALTER TABLE beta ALTER COLUMN aref SET DEFAULT %L'
            , (SELECT a.id::text FROM alpha a));
END $$;

SELECT必須返回單個值。

text明確地轉換為,這不是絕對必要的。uuid也不需要將字元串文字轉換為目標類型。Postgres 將自動從列類型派生。

有關的:

引用自:https://dba.stackexchange.com/questions/144818