postgresql - PostgreSQL中的"Abstract"表(继承)

标签 postgresql inheritance postgresql-9.3

SO 上有很多 PostgreSQL 继承问题,但我想弄清楚我的具体情况。假设我有以下表格:

CREATE TABLE abstract_person (
    id bigint PRIMARY KEY,
    ver int NOT NULL,
    code varchar NOT NULL,
    id_country bigint NOT NULL,
    ...
);

CREATE TABLE abstract_person_phone (
    id bigint PRIMARY KEY,
    ver int NOT NULL,
    phone varchar NOT NULL,
    id_abstract_person bigint NOT NULL
);

CREATE TABLE individual (
    first_name varchar NOT NULL,
    last_name varchar NOT NULL,
    ...
    CONSTRAINT individual_pkey PRIMARY KEY (id),
    CONSTRAINT individual_id_country_fkey FOREIGN KEY (id_country) REFERENCES country (id),
    CONSTRAINT individual_unique UNIQUE (code) DEFERRABLE INITIALLY DEFERRED
) INHERITS (abstract_person);

继承表会越来越多,individual只是一个例子。 abstract_person 表不会永远 直接写入。我的以下假设是否正确:

  1. 子表不继承唯一性、主键和外键约束,但我通过直接在子表上声明这些约束来解决这个问题。

  2. 关于在 abstract_personabstract_person_phone 表之间实现引用完整性,我可以使用触发器来实现。我不能在父表上使用触发器,我必须将它附加到每个子表,但我可以使用单个触发器函数,如下所示:

    CREATE OR REPLACE FUNCTION person_deleted() RETURNS trigger AS $BODY$
    BEGIN
        DELETE FROM abstract_person_phone WHERE id_abstract_person = OLD.id;
        RETURN OLD;
    END;
    $BODY$ LANGUAGE plpgsql;
    
    CREATE TRIGGER individual_deleted_trigger AFTER DELETE ON individual
        FOR EACH ROW EXECUTE PROCEDURE person_deleted();
    

最佳答案

是的,你完全正确。所有这些约束都不是 传播到子表。 至于触发器,你可以像你写的那样在子表上使用它们。并且您可以在父表上使用触发器,该触发器将决定应该将数据放在哪些子表中,以根据某些条件在 insert 查询(或在 select 上检索)条件

关于postgresql - PostgreSQL中的"Abstract"表(继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29366515/

相关文章:

postgresql - 如何在 PostgreSQL (9.1) 函数中将字符转换为整数?

SQL 数据库设计 : many to many relationship between 'accounts' and 'transactions' tables such that a transaction can have 'from' and 'to'

java - 如何使用instanceof函数打印继承中的某个类别?

c++ - 抽象类需要什么?为什么要通过其基类访问派生类方法?在 C++ 中

postgresql - 在 View 中使用 hstore 比较转储和恢复 PostgreSQL 数据库失败

sql - 根据当前行的条件选择前几行

postgresql - postgres 流复制中主要落后于恢复

c++ - 使用可变参数模板的 mixin 继承的可见性规则

jdbc - squirrelsql 不喜欢 query_to_xml

performance - 删除 id 不在另一个表中的非常大的表记录