postgresql - 在 Postgres 中,当表 A 中的一行被删除时,如何从表 B 中删除一行?

标签 postgresql foreign-keys sql-delete cascade

我正在使用 Postgres 9.5.0。我有下表

myproject=> \d my_objects;
                                  Table "public.my_objects"
       Column        |            Type             |              Modifiers              
---------------------+-----------------------------+-------------------------------------
 name                | character varying           | 
 day                 | date                        | 
 distance            | double precision            | 
 user_id             | integer                     | 
 created_at          | timestamp without time zone | not null
 updated_at          | timestamp without time zone | not null
 distance_unit_id    | integer                     | 
 import_completed    | boolean                     | 
 id                  | character varying           | not null default uuid_generate_v4()
 linked_my_object_time_id | character varying           | 
 web_crawler_id      | integer                     | 
 address_id          | character varying           | 
Indexes:
    "my_objects_pkey" PRIMARY KEY, btree (id)
    "index_my_objects_on_user_id_and_day_and_name" UNIQUE, btree (user_id, day, name)
    "index_my_objects_on_user_id" btree (user_id)
    "index_my_objects_on_web_crawler_id" btree (web_crawler_id)
Foreign-key constraints:
    "fk_rails_5287d445c0" FOREIGN KEY (address_id) REFERENCES addresses(id) ON DELETE CASCADE
    "fk_rails_970b2325bf" FOREIGN KEY (distance_unit_id) REFERENCES distance_units(id)
    "fk_rails_dda3297b57" FOREIGN KEY (linked_my_object_time_id) REFERENCES my_object_times(id) ON DELETE CASCADE
    "fk_rails_ebd32625bc" FOREIGN KEY (web_crawler_id) REFERENCES web_crawlers(id)
    "fk_rails_fa07601dff" FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE

现在,每个 my_object 都有一个地址字段。我想要的是当我删除 my_object 时,相应的地址条目也被删除。在不将 address_id 列移出 my_objects 表的情况下,是否可以进行一些设置,以便当我从 my_objects 表中删除一行时,任何相应的地址数据也会被删除?显然,我设置的外键无法完成工作。

最佳答案

您可以使用触发器来做到这一点:

CREATE OR REPLACE FUNCTION remove_address() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   DELETE FROM public.addresses WHERE id = OLD.address_id;
   RETURN OLD;
END;$$;

CREATE TRIGGER remove_address
   AFTER DELETE ON public.my_objects FOR EACH ROW
   EXECUTE PROCEDURE remove_address()

关于postgresql - 在 Postgres 中,当表 A 中的一行被删除时,如何从表 B 中删除一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39750739/

相关文章:

ruby-on-rails - Heroku - ActiveRecord::StatementInvalid(PG::错误:错误:列 "requested"不存在

mysql - 从表 A 中删除,其中表 A 中不存在子项且表 B 中不存在子项

sql - 使用 Postgresql 计算用户流失率

sql - 如何在 Postgres 中列出 View 的列?

asp.net - Entity Framework 与相关实体更新

Mysql:添加外键不会在 MyISAM 表上发出警告/错误

mysql外键仅引用复合主键的一部分

java - 基于 jcomboBox 从数据库中删除数据会引发错误

ruby-on-rails - Rails - 查找或创建 - 用于和数组?

mysql 5.6 外键约束错误; 5.5 没有出现