PostgreSQL中的继承外键

3
我有一个PostgreSQL数据库,包含3个表,我的模式如下。 enter image description here
CREATE TABLE table_a (
    id SERIAL PRIMARY KEY,
    name_a VARCHAR(255)
);

CREATE TABLE table_b (
    name_b VARCHAR(255) 
) INHERITS (table_a);

CREATE TABLE table_c (
    name_c VARCHAR(255)
) INHERITS (table_a);

insert into table_b (name_a, name_b) values('table A','table B1');
insert into table_b (name_a, name_b) values('table A','table B2');
insert into table_c (name_a, name_c) values('table A','table C1');
insert into table_c (name_a, name_c) values('table A','table C2');

select * from table_a;
select * from table_b;
select * from table_c;

enter image description here

现在我想要在表B表C之间添加一个关联,就像这样:

enter image description here

当我们继承同一张表时,我不知道这是否可能?

我不知道如何创建这种关联?

1个回答

2

table_b上需要一个唯一标识符或主键。引用文档:

所有父表上的检查约束和非空约束都会自动继承到其子级,除非使用NO INHERIT子句明确指定不继承其他类型的约束(唯一、主键和外键约束)则不会被继承

"Original Answer"翻译成"最初的回答"
CREATE TABLE table_a (
    id SERIAL PRIMARY KEY,
    name_a VARCHAR(255)
);

CREATE TABLE table_b (
    name_b VARCHAR(255),
    primary key (id)     --> here you set the PK
) INHERITS (table_a);

CREATE TABLE table_c (
    name_c VARCHAR(255),
    id_b int references table_b(id) --> the fk to b through pk
) INHERITS (table_a);

替代方案

在您的第二个图表中,您是否为 table_b 添加了某种标识符。这是正确的,因为您可以通过唯一字段引用表格。在这种情况下,DDL 将如下所示:

CREATE TABLE table_a (
    id SERIAL PRIMARY KEY,
    name_a VARCHAR(255)
);

CREATE TABLE table_b (
    name_b VARCHAR(255),
    id_b SERIAL UNIQUE     --> Here the unique id for b
    --, primary key (id)   -- optionally
) INHERITS (table_a);

CREATE TABLE table_c (
    name_c VARCHAR(255),
    id_b int references table_b(id_b)  --> the fk to b through unique
) INHERITS (table_a);

我更喜欢第一种方法,但我也发布了这个答案仅供学术目的。

我更倾向于使用第一种方法,但为了学术目的,我也发布了这个答案。


我的表C中的列id_bnull - Mercer
@Mercer,感谢您的评论。我改进了我的答案。此外,您可以在此处找到一个使用FK的示例:https://www.db-fiddle.com/f/kG1Vxo8jMWsNsVRvREfapr/0 - dani herrera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接