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