簡體   English   中英

新用戶創建后創建新記錄的觸發器在 PostgreSQL 中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM