PostgreSQL生成列實現(xiàn)過程介紹
PostgreSQL中生成列是從其他列計算而來的特殊列。生成列與普通列不同,不是固定的值,而是又引用表中其他列的表達式?jīng)Q定的。生成列在SQL標準(ISO/IEC 9075)中引入,被主流RDBMS支持,PostgreSQL12開始支持生成列。
示例
下面首先創(chuàng)建一張表,用于演示PostgreSQL生成列:
CREATE TABLE Students ( Id INTEGER PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), FullName VARCHAR(101) GENERATED ALWAYS AS (FirstName || ' ' || LastName) STORED );
上面示例中最后一列是生成列,PostgreSQL生成列在定義中必須有GENERATED ALWAYS(通常其他關(guān)系型數(shù)據(jù)庫為可選)。另外生成列結(jié)尾必須有STORED。這指定了生成列需要被存儲(相對于virtual,下面有解釋),其他關(guān)系型數(shù)據(jù)庫這通常也是可選的(默認值為virtual)。
生成列的語法如下:
<column_name> <datatype> GENERATED ALWAYS AS(expression) [STORED|VIRTUAL]
在GENERATED ALWAYS AS (expression) Stored子句中,使用現(xiàn)有的列指定生成列表達式,為生成列計算值。
現(xiàn)在我們已經(jīng)創(chuàng)建了帶生成列的表,下面插入數(shù)據(jù):
INSERT INTO Students (Id, FirstName, LastName) VALUES (0001, 'Lucy', 'Green'); INSERT INTO Students (Id, FirstName, LastName) VALUES (0002, 'Aziz', 'Ahmad'); INSERT INTO Students (Id, FirstName, LastName) VALUES (0003, 'Zohan', 'Ahuja'); INSERT INTO Students (Id, FirstName, LastName) VALUES (0004, 'Homer', 'Presley'); INSERT INTO Students (Id, FirstName, LastName) VALUES (0005, 'Sally', 'Smith');
注意,我們插入數(shù)據(jù)不包括生成列,現(xiàn)在查看數(shù)據(jù):
SELECT * FROM Students;
結(jié)果為:
id | firstname | lastname | fullname
----+-----------+----------+---------------
1 | Lucy | Green | Lucy Green
2 | Aziz | Ahmad | Aziz Ahmad
3 | Zohan | Ahuja | Zohan Ahuja
4 | Homer | Presley | Homer Presley
5 | Sally | Smith | Sally Smith
我們看到生成列包含F(xiàn)irstName和LastName兩列值的連接串。生成列表達式不僅為字符串連接,舉例:一些場景中需要基于原價和折扣計算實際價格。
Stored vs Virtual
生成列可以為 stored 或 virtual. 兩者的差異為:
- STORED (aka 持久化): 列值被存儲在表里. 當(dāng)寫(插入或更新)時存儲列被重新計算,并像普通列一樣占用存儲空間。
- VIRTUAL: 虛擬生成列不占用存儲空間,僅當(dāng)讀時才計算。PostgreSQL (14) 僅支持stored 生成列。
限制說明
生成的列有許多限制。例如,生成表達式不能引用另一個生成的列。此外,它們只能使用不可變函數(shù),不能以任何方式使用子查詢或引用當(dāng)前行以外的任何內(nèi)容。具體包括:
- 生成表達式只能使用不可變函數(shù),不能以任何方式使用子查詢或引用當(dāng)前行以外的任何內(nèi)容。
- 生成表達式不能引用另一個生成的列。
- 生成表達式不能引用系統(tǒng)列(表類除外)。
- 生成的列不能有列默認值或標識定義。
- 生成的列不能是分區(qū)鍵的一部分。
- 外部表可以生成列
到此這篇關(guān)于PostgreSQL生成列實現(xiàn)過程介紹的文章就介紹到這了,更多相關(guān)PostgreSQL生成列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在postgresql數(shù)據(jù)庫中創(chuàng)建只讀用戶的操作
這篇文章主要介紹了在postgresql數(shù)據(jù)庫中創(chuàng)建只讀用戶的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
15個postgresql數(shù)據(jù)庫實用命令分享
這篇文章主要介紹了15個實用的postgresql數(shù)據(jù)庫命令分享,都是一些技巧性的postgresql命令,需要的朋友可以參考下2014-07-07
在 PostgreSQL中解決圖片二進制數(shù)據(jù)由于bytea_output參數(shù)問題導(dǎo)致顯示不正常的問題
無論 bytea_output 參數(shù)設(shè)置為 hex 還是 escape,你都可以通過 C# 訪問 PostgreSQL 數(shù)據(jù)庫,并且正常獲取并顯示圖片,本篇隨筆介紹這個問題的處理過程,感興趣的朋友跟隨小編一起看看吧2024-03-03
Postgresql源碼分析returns?setof函數(shù)oracle管道pipelined
這篇文章主要為大家介紹了Postgresql源碼分析returns?setof函數(shù)oracle管道pipelined,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
PostgreSQL 如何獲取當(dāng)前日期時間及注意事項
這篇文章主要介紹了PostgreSQL 如何獲取當(dāng)前日期時間及注意事項,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

