網(wǎng)站首頁 編程語言 正文
PostgreSQL中生成列是從其他列計算而來的特殊列。生成列與普通列不同,不是固定的值,而是又引用表中其他列的表達(dá)式?jīng)Q定的。生成列在SQL標(biāo)準(zhǔn)(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ù)庫這通常也是可選的(默認(rèn)值為virtual)。
生成列的語法如下:
<column_name> <datatype> GENERATED ALWAYS AS(expression) [STORED|VIRTUAL]
在GENERATED ALWAYS AS (expression) Stored子句中,使用現(xiàn)有的列指定生成列表達(dá)式,為生成列計算值。
現(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兩列值的連接串。生成列表達(dá)式不僅為字符串連接,舉例:一些場景中需要基于原價和折扣計算實際價格。
Stored vs Virtual
生成列可以為 stored 或 virtual. 兩者的差異為:
- STORED (aka 持久化): 列值被存儲在表里. 當(dāng)寫(插入或更新)時存儲列被重新計算,并像普通列一樣占用存儲空間。
- VIRTUAL: 虛擬生成列不占用存儲空間,僅當(dāng)讀時才計算。PostgreSQL (14) 僅支持stored 生成列。
限制說明
生成的列有許多限制。例如,生成表達(dá)式不能引用另一個生成的列。此外,它們只能使用不可變函數(shù),不能以任何方式使用子查詢或引用當(dāng)前行以外的任何內(nèi)容。具體包括:
- 生成表達(dá)式只能使用不可變函數(shù),不能以任何方式使用子查詢或引用當(dāng)前行以外的任何內(nèi)容。
- 生成表達(dá)式不能引用另一個生成的列。
- 生成表達(dá)式不能引用系統(tǒng)列(表類除外)。
- 生成的列不能有列默認(rèn)值或標(biāo)識定義。
- 生成的列不能是分區(qū)鍵的一部分。
- 外部表可以生成列
原文鏈接:https://blog.csdn.net/neweastsun/article/details/128639607
相關(guān)推薦
- 2022-07-13 Pycharm使用技巧_Pycharm配置autopep8
- 2023-06-16 Visual?Studio?如何創(chuàng)建C/C++項目問題_C 語言
- 2022-06-16 Python語法學(xué)習(xí)之正則表達(dá)式的使用詳解_python
- 2022-03-27 Android實現(xiàn)房貸計算器功能_Android
- 2022-09-10 python中的隨機數(shù)種子seed()用法說明_python
- 2022-10-02 iOS簡單抽屜效果的實現(xiàn)方法_IOS
- 2023-04-06 C++深淺拷貝及簡易string類實現(xiàn)方式_C 語言
- 2022-07-09 Docker可視化、數(shù)據(jù)持久化
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支