[英]Trigger for creating a new record after new user creation doesn't work in PostgreSQL
我有一個settings
表和一個users
表。 我想創建一個觸發器來在每次創建新用戶時插入一個新的settings
記錄,並在settings
記錄中引用新創建的用戶的 ID(在本例中為settings.user_id
)。 目前,我想出了這個觸發器和 function 但每當我嘗試insert
記錄插入users
表時,查詢都無法執行。
程序:
CREATE OR REPLACE FUNCTION create_settings()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
BEGIN
INSERT INTO settings (user_id) VALUES (OLD.id);
RETURN OLD;
END;
$$
扳機:
CREATE TRIGGER create_settings
AFTER INSERT ON users
EXECUTE PROCEDURE create_settings();
這是我得到的錯誤:
ERROR: null value in column "user_id" of relation "settings" violates not-null constraint
DETAIL: Failing row contains (95a8d1ae-cf9d-40be-b5d2-b2d231fb7e1b, null, null, null, null, light, 2022-01-02 15:29:14.290823).
CONTEXT: SQL statement "INSERT INTO settings (user_id) VALUES (OLD.id)"
PL/pgSQL function create_settings() line 3 at SQL statement
我唯一需要的字段是錯誤中的第一個null
,它是按 ID 對用戶的實際引用(大多數值 null 是可選的,默認情況下為NULL
)。
查看create trigger的文檔。 特別是行級和語句級觸發器之間的區別。 您保存語句級觸發器。 語句級觸發器沒有偽 roes Old 或 New 值,它們都是 null。 您需要一個行級觸發器來從舊或新獲取值。 所以:
CREATE TRIGGER create_settings
AFTER INSERT ON users
for each row
EXECUTE PROCEDURE create_settings();
請務必注意,OLD 變量僅適用於在行級別執行 UPDATE/DELETE 的觸發器,如此處所示,因此在這種情況下,無法使用 INSERT 觸發器獲取所需的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.