Postgresql
繼承和主鍵約束
我目前正在嘗試了解物件導向的功能如何在 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
,但是SELECT ... FROM person;
實際上與
SELECT ... FROM ONLY person UNION ALL SELECT ... FROM praktikant;
查看
EXPLAIN
兩個查詢的輸出以確認這一點。這些表中的每一個都有自己的約束和索引,它們不會影響另一個表。
所以你的問題的答案是:
- 這些表是完全獨立的,除了
praktikant
必須有所有列person
- 查詢
person
將包括來自praktikant
- 這個問題不是很清楚,但我想你可以從上面自己回答。對每個表的行單獨進行鎖定。
- 一點也不。此外,對一個表的約束不會影響另一個表。具體來說,您不能保證兩個表中條目的唯一性。
- 實際用途很少。在 v10 中的聲明式分區出現之前,它被用於在 PostgreSQL 中實現分區。