日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

PostgreSQL生成列實現過程介紹_PostgreSQL

作者:夢想畫家 ? 更新時間: 2023-03-01 編程語言

PostgreSQL中生成列是從其他列計算而來的特殊列。生成列與普通列不同,不是固定的值,而是又引用表中其他列的表達式決定的。生成列在SQL標準(ISO/IEC 9075)中引入,被主流RDBMS支持,PostgreSQL12開始支持生成列。

示例

下面首先創建一張表,用于演示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(通常其他關系型數據庫為可選)。另外生成列結尾必須有STORED。這指定了生成列需要被存儲(相對于virtual,下面有解釋),其他關系型數據庫這通常也是可選的(默認值為virtual)。

生成列的語法如下:

<column_name> <datatype> GENERATED ALWAYS AS(expression) [STORED|VIRTUAL]

在GENERATED ALWAYS AS (expression) Stored子句中,使用現有的列指定生成列表達式,為生成列計算值。

現在我們已經創建了帶生成列的表,下面插入數據:

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');

注意,我們插入數據不包括生成列,現在查看數據:

SELECT * FROM Students;

結果為:

?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

我們看到生成列包含FirstName和LastName兩列值的連接串。生成列表達式不僅為字符串連接,舉例:一些場景中需要基于原價和折扣計算實際價格。

Stored vs Virtual

生成列可以為 stored 或 virtual. 兩者的差異為:

  • STORED (aka 持久化): 列值被存儲在表里. 當寫(插入或更新)時存儲列被重新計算,并像普通列一樣占用存儲空間。
  • VIRTUAL: 虛擬生成列不占用存儲空間,僅當讀時才計算。PostgreSQL (14) 僅支持stored 生成列。

限制說明

生成的列有許多限制。例如,生成表達式不能引用另一個生成的列。此外,它們只能使用不可變函數,不能以任何方式使用子查詢或引用當前行以外的任何內容。具體包括:

  • 生成表達式只能使用不可變函數,不能以任何方式使用子查詢或引用當前行以外的任何內容。
  • 生成表達式不能引用另一個生成的列。
  • 生成表達式不能引用系統列(表類除外)。
  • 生成的列不能有列默認值或標識定義。
  • 生成的列不能是分區鍵的一部分。
  • 外部表可以生成列

原文鏈接:https://blog.csdn.net/neweastsun/article/details/128639607

欄目分類
最近更新