Postgresql 为什么使用继承的外键不起作用?

Postgresql 为什么使用继承的外键不起作用?,postgresql,inheritance,Postgresql,Inheritance,我收到以下错误消息: create table abstract_addresses ( address_id int primary key ); create table phone_numbers ( phone_number text not null unique ) inherits (abstract_addresses) ; create table contacts ( name text primary key, address_id int not nu

我收到以下错误消息:

create table abstract_addresses (
  address_id int primary key
);

create table phone_numbers (
  phone_number text not null unique
) inherits (abstract_addresses) ;

create table contacts (
  name text primary key,
  address_id int not null references abstract_addresses(address_id)
);

insert into phone_numbers values (1, '18005551212'); --works

select * from abstract_addresses;

address_id
1

select * from phone_numbers;

address_id  phone_number
1           18005551212


insert into contacts values ('Neil', 1); --error

只是postgresql表继承的一个不好的用例?

根据文档中的警告:

继承特性的一个严重限制是索引(包括唯一约束)和外键约束只适用于单个表,而不适用于它们的继承子表。外键约束的引用侧和被引用侧都是如此

要想做你想做的事:

  • 创建一个只有id的表-就像您所做的那样

  • 不要使用继承。真的没有。划分日志表很有用;不是因为你在做什么

  • 将电话号码id设置为默认值
    nextval('abstract\u addresses\u address\u id\u seq')
    ,或序列名称的任意值

  • 电话号码中添加外键
    参考
    摘要地址(地址id)
    。使其可推迟,最初推迟

  • 电话号码
    上添加插入后触发器,在需要时在
    抽象地址
    中插入新行

  • 如果合适,在
    电话号码
    上添加一个after delete触发器,级联删除
    抽象地址
    -确保它发生在删除之后,否则当您从
    电话号码
    中删除时,受影响的行将报告不正确的值

  • 这样,您将有一个
    abstract\u address
    ,用于偶尔需要这样一个东西的表中,同时仍然能够对
    电话号码进行硬引用,后者才是您真正想要的


    需要注意的一点是:它不能很好地与ORMs配合使用。

    电话号码插入功能正常,因为您没有在电话号码上创建外键来提取地址。@GriffeyDog,在插入电话号码后,提取地址的地址id值为1。
    ERROR: insert or update on table "contacts" violates foreign key constraint "contacts_address_id_fkey"
    SQL state: 23503
    Detail: Key (address_id)=(1) is not present in table "abstract_addresses".