Postgresql

繼承和主鍵約束

  • May 28, 2020

我目前正在嘗試了解物件導向的功能如何在 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表。praktikantInserting rows intopraktikant不會中插入行person,但是

SELECT ... FROM person;

實際上與

SELECT ... FROM ONLY person
UNION ALL
SELECT ... FROM praktikant;

查看EXPLAIN兩個查詢的輸出以確認這一點。

這些表中的每一個都有自己的約束和索引,它們不會影響另一個表。

所以你的問題的答案是:

  1. 這些表是完全獨立的,除了
  • praktikant必須有所有列person
  • 查詢person將包括來自praktikant
  1. 這個問題不是很清楚,但我想你可以從上面自己回答。對每個表的行單獨進行鎖定。
  2. 一點也不。此外,對一個表的約束不會影響另一個表。具體來說,您不能保證兩個表中條目的唯一性。
  3. 實際用途很少。在 v10 中的聲明式分區出現之前,它被用於在 PostgreSQL 中實現分區。

引用自:https://dba.stackexchange.com/questions/268042