簡體   English   中英

如果實體/外鍵更新,則postgres更新父級

[英]postgres update parent if entity / foreign key updates

我有一張餐桌recipes ,每個recipe都可以有多個entries

CREATE TABLE IF NOT EXISTS "recipes" (
    "ident" SERIAL PRIMARY KEY,
    "identifier" TEXT NOT NULL UNIQUE,
    "modified_on" TIMESTAMP WITH TIME ZONE DEFAULT NULL
);

CREATE TABLE IF NOT EXISTS "entries" (
    "ident" SERIAL PRIMARY KEY,
    "recipe_id" INTEGER NOT NULL,
    "name" TEXT
    FOREIGN KEY ("recipe_id") REFERENCES "recipes"("ident") ON DELETE CASCADE
);

現在,當recipe更新時,將調用以下函數並更新我的時間戳:

CREATE OR REPLACE FUNCTION update_recipe_timestamp_proc()
RETURNS TRIGGER AS $$
BEGIN
    NEW."modified_on" = now();
    PERFORM pg_notify('notify_recipes_update', CAST(NEW.ident AS text));
    RETURN NEW;   
END;
$$ language 'plpgsql';

現在我也想每當我戳modified_on得到更新entry更新。

以下trigger不起作用。

DROP TRIGGER IF EXISTS update_recipes_timestamp_e ON entries;
CREATE TRIGGER update_recipes_timestamp_e BEFORE UPDATE ON entries FOR EACH ROW EXECUTE PROCEDURE update_recipe_timestamp_proc();

錯誤:記錄“ NEW”沒有字段“ modified_on”

我在評論中指出了這一點,但是為了完整起見,我將其放在此處。

當前的問題是您試圖設置不存在的字段的值。 觸發器中的NEW是您要插入或更新AND的實際記錄,因為這是在entries表上發生的。 基於此,您可以看到它們為什么不起作用以及為什么會出現該錯誤。

解決該問題的方法是刪除該行NEW."modified_on" = now(); 而是將其替換為將更新recipe表的UPDATE語句。

您的最終觸發代碼應類似於:

CREATE OR REPLACE FUNCTION update_recipe_timestamp_proc()
RETURNS TRIGGER AS $$
BEGIN
    UPDATE recipe SET modified_on = now() WHERE ident = NOW.recipe_id;
    PERFORM pg_notify('notify_recipes_update', CAST(NEW.ident AS text));
    RETURN NEW;   
END;
$$ language 'plpgsql';

您要在entries中插入/更新的entries具有字段recipe_id ,您可以在UPDATE語句中使用該字段,以確保在recipe表中更新正確的記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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