Postgresql
如何使用變數的值設置列 DEFAULT
在用於設置使用隨機 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 將自動從列類型派生。有關的: