我目前正在尝试了解面向对象的功能如何在 Postgres 中发挥作用。在一些测试中,我注意到当您从继承表中插入或删除时,这些更改也会发生在超表上,反之亦然。
问题 1:如果您有 2 个表并且表 1 没有约束但表 2 具有标识主键列并且还从表 1 继承列,那么数据如何物理存储。
问题 2: 由于一个表从另一个表继承列并在表 2 中插入也会导致表 1 的填充,因此数据是否完全隔离和冗余存储在不同页面上的两个不同元组中,或者元组是否以某种方式链接?如果它是分开的,这是否意味着两个元组在写入操作的情况下都会被锁定?
问题3: 索引如何影响表继承?
问题 4: Postgres 中面向对象功能的实际用途是什么?
使用的表:
create table person (
nachname varchar(30),
age int,
eigenschaft varchar(30)
)
create table praktikant (
praktikant_id int generated always as identity primary key,
klassenstufe int) inherits(person);
插入:
insert into praktikant(nachname, age, eigenschaft, klassenstufe)
values('Schmidt', 16, 'fleißig', 9)
在您的示例中,这两个表是两个不同的
person
表。praktikant
Inserting rows intopraktikant
不会在中插入行person
,但是实际上与
查看
EXPLAIN
两个查询的输出以确认这一点。这些表中的每一个都有自己的约束和索引,它们不会影响另一个表。
所以你的问题的答案是:
这些表是完全独立的,除了
praktikant
必须有所有列person
查询
person
将包括来自praktikant
这个问题不是很清楚,但我想你可以从上面自己回答。对每个表的行单独进行锁定。
一点也不。此外,对一个表的约束不会影响另一个表。具体来说,您不能保证两个表中条目的唯一性。
实际用途很少。在 v10 中的声明式分区出现之前,它被用于在 PostgreSQL 中实现分区。