PostgreSQL 邏輯儲存結構

2021-09-26 09:41:42 字數 3909 閱讀 4552

在postgresql資料庫系統中,資料的組織結構可以分為三層:

資料庫:乙個postgresql資料庫服務可以管理多個資料庫,當應用連線到乙個資料庫時,只能訪問這個資料庫中的資料,而不能訪問其他資料庫的內容(dblink除外)

表、索引:乙個資料庫有很多張表、索引。在postgresql中表的術語是「relation」,其他資料庫叫做「table」

資料行:每張表中,有多行資料,行在postgresql中的術語是「tuple」

tips:1.在postgresql中,乙個資料庫服務可以有多個資料庫,而乙個資料庫不能屬於多個例項,

2.oracle資料庫中,乙個例項只能有乙個資料庫,但是乙個資料庫可以在多個例項中(rac)

資料庫基本操作:

建立......

修改資料庫:alter database name [option]
eg:

改變最大連線數:alter database test01 connect  limit 10;
重新命名:alter database test01 rename to mydb01;
改變資料庫test01 的配置引數,當某一使用者連線到這個使用者時,某個引數就設定為乙個指定值。

例如在關閉資料庫test01 上預設索引掃瞄:alter database test01 set enable_indexcan to off;

刪除資料庫,有以下幾種情況需要注意:

1.當乙個資料庫不存在,刪除命令時也不會報錯

2.如果有人連線到這個資料庫,將不能刪除該資料庫

3.不能在事務中建立或者刪除資料庫;可以在事務塊中修改資料庫

模式

模式是資料庫中的乙個概念,可將其理解為命名空間或者目錄,不同模式下可以有相同名稱的表、函式等物件且互相不衝突,提出模式概念為了方便管理,只要有許可權,每個模式的物件可以相互呼叫。

使用模式的以下幾個原因:

1.允許多個使用者在使用同一資料庫時彼此互不干擾

2.把資料庫物件放在不同模式下,組成邏輯單元,便於管理

3.第三方應用可以放在不同模式,這樣就不會和其他物件名字衝突

建立模式: create schema osdba;

刪除模式: drop schema osdba;

為使用者「osdba」建立模式,名字為「osdba」:create schema  authorization osdba;
在建立乙個模式時,可以在在這個模式下建立一些表的檢視:create schema osdba; create table t1(id int,title text)  create table t2(id int,content text)
在模式中可以修改名稱和屬主: alter schema name rename to newname;   alter schema name owner to newowner
公共模式:建立或者訪問模式中的物件,需要寫出受修飾的名字,名字中包含模式以及表名,他們之間用「點」分開: schema_name.table.name

通常情況下,創建立和訪問資料庫不需要指定模式,預設為「public」 模式

模式的搜尋路徑

使用的原因:使用資料庫物件時,雖可以使用他的全稱來定位(schema_name.object_name)很繁瑣

解決的辦法:類似於shell中$path 環境變數,執行乙個shell命令,只有在該命令位於$path的目錄列表中,可以通過命令直接執行,否則需要輸入全路徑名稱。

檢視模式的搜尋路徑:show serch_path;

test=# show search_path;

search_path

--------------

benchmarksql

(1 row)

模式的許可權

預設情況下,使用者無法訪問模式中不屬於他們的物件;如果要訪問,必須在模式上賦予他們"usage"許可權

使用者可以在別人模式裡建立物件,當然需要被賦予在該模式上"create"許可權

預設情況下,每個人"public"模式都有"create" 、"usage"許可權,也就是說,允許所有可以連線資料庫上的使用者可以建立物件了;

也可以**許可權:revoke create on schema public from     public;

tips:第乙個"public" 是模式名稱,識別符號;  第二個是 所有使用者,關鍵字。在**以後,其他使用者就不能在模式"public" 下建立物件

在oracle 中,系統不允許建立和他們所有者不同名的模式,實現了標準中規定的基本模式的資料庫系統裡,模式和使用者概念基本一樣。

如果在postgresql中為每個使用者建立乙個與使用者名稱同名模式,就與oracle相容。

表的儲存屬性

toast技術,用於儲存大字段的值,postgresql頁面大小固定(8kb),並且不允許跨越多個頁面,不可能直接儲存非常大的字段,為了突破限制,大的字段值通常被壓縮或者切片成多個物理行存到另一張系統表。

每個欄位有4種toast策略:

plain:避免壓縮或線外儲存。對於一些不能toast的資料型別可選擇此策略

extended:允許壓縮和線外儲存。大多數可以toast 的資料型別可選擇

externa:允許行外儲存,不允許壓縮。因為沒有壓縮

main:允許壓縮,但不允許行外儲存

postgresql資料庫會為每個可以toast資料型別選擇乙個預設策略,可以用"alter table set storage"改變某個系統預設分配toast策略。    

postgresql中,更新一條資料,舊資料行不會被覆蓋,而是會插入一條新的資料行,如果塊中有空閒空間,則新行直接插入到這個資料塊。由於行仍然在這個資料塊中,因此使用postgresql 可以使用heap-only tuple技術,

他會在舊行與新行之間建立乙個鍊錶,不需要更新索引。索引仍然會指向舊的行,通過舊行與新行之間的鍊錶,找到新的索引

臨時表支援兩種臨時表:會話級臨時表,儲存在整個會話的生命週期;事務級臨時表:只存在這個事務的生命週期

在postgresql中,兩種臨時表,當會話結束,臨時表就會消失;在oracle中,只是臨時表資料消失,而臨時表還存在

在預設情況下,建立臨時表是會話級別的

create temporary table tmp_t1(id int primary key,note text);

如果想要建立事務級別臨時表

create temporary table tmp_t1(id int primary key,note text) on commit  delete rows;

事實上,"on commit" 有三種形式:

on commit preserve rows :不帶on commit 子名稱,預設情況下,資料會存在整個會話週期

on commit delecte rows:資料只存在事務週期中,事務一提交,資料就消失

on commit drop:資料值存在事務週期中,事務提交,臨時表就消失

postgresql為和其他資料庫建立臨時表語句保持相容性,有"global"和"local"關鍵字,但沒有任何用處

檢查約束: 在設定某個欄位裡的數值必須使約束表示式為真

非空約束:宣告乙個字段不能為null

唯一約束:保證在乙個欄位或一組欄位裡的資料相較於表中其他行資料唯一

外來鍵約束:用於約束表中乙個字段或者多個字段數值必須出現在另乙個表的乙個字段或者多個欄位中。

PostgreSQL 儲存json,jsonb型別

postgresql 字串隱式轉換json指令碼 隱式將varchar轉換為json create or replace function json in varchar varchar returns json as select json in 1 cstring language sql im...

Postgresql儲存過程

pg的儲存過程與oracle的稍微有點不一樣,它的結構是這樣的 語法 create or replace function function name arg1,arg2.returns return type as body declare 變數宣告 begin 函式體end body langu...

棧 順序儲存結

棧是線性表的特例,棧的順序儲存其實也是線性表順序的儲存的簡化,我們簡稱為順序棧。對於這種只能一頭插入,一頭刪除的線性表來說,下標為0的一端作為棧底比較好,因為首元素都存在棧底,變化最小。我們定義乙個top變數來指示棧頂元素在陣列中的位置,這top如同中學的游標卡尺的游標,它可以來回移動,意味著棧頂的...