PostgreSQL 中的自動遞增值

Bilal Shahid 2023年1月30日
  1. 在 PostgreSQL 中使用 SERIAL 關鍵字實現 AUTO_INCREMENT
  2. 使用 PostgreSQL AUTO_INCREMENT 中的 GENERATED { BY DEFAULT || ALWAYS} AS 子句
PostgreSQL 中的自動遞增值

MySQL 中的 Auto_Increment 是一個自增變數,有助於為表中的資料集提供唯一標識。它最常用於 PRIMARY 鍵中以唯一地索引行。

在 MySQL 中,我們可以將 AUTO INCREMENT 附加到我們想要的任何列。

CREATE TABLE test (
    id int NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id)
);

但是,今天我們將學習如何在 PostgreSQL 中執行此操作。

在 PostgreSQL 中使用 SERIAL 關鍵字實現 AUTO_INCREMENT

讓我們用一個 id 和一個 color 列製作一個表 CAT

create table cat(
	id SERIAL,
	color varchar not null
);

讓我們繼續往裡面插入一些值。

insert into cat (color) values('black'), ('white'), ('brown'), ('tuxedo');

確保指定 COLUMN_NAME,以便該函式不會選擇所有列並違反 SERIAL 目標。如果你深入研究 PostgreSQL 文件,你將瞭解到:

PostgreSQL 文件

當你單擊 RUN 時,它將顯示以下結果。

輸出:

使用 SERIAL 關鍵字

因此,你可以看到 SERIAL 方法有效地實現了 AUTO_INCREMENT

PostgreSQL 中 SERIAL 及其替代方案的簡要工作

SERIAL 關鍵字生成一個整數列。代替 SERIAL,你也可以使用 SERIAL4,代表 4 個位元組。

如果你想要更多識別符號或更大範圍的自動生成值,你還可以使用 BIGSERIALSERIAL8,最多可容納 2^31 識別符號。

SERIAL 方法可以替換為以下內容。

create sequence id_col_AI;
create table cat(
	id integer DEFAULT nextval('id_col_AI') NOT NULL,
	color varchar not null
);

那麼,這裡發生了什麼?SEQUENCE 定義了一個新的數字生成器。如果你想將 START VALUE 更改為你喜歡的值,你可以在宣告的末尾使用 START (your number) 引數。

然後在 ID 列中,將其定義為 DEFAULT 以從列內的生成器中獲取下一個值。DEFAULT 傾向於為該列分配除 NULL 之外的預設值。

然後,你參考建立的 SEQUENCE 並呼叫 NEXTVAL(your seq) 以按順序獲取值。這使得 NOT NULL 可以防止使用者隱式或顯式插入任何 NULL

如果你的表已經建立,你也可以嘗試將其擴充套件到 ALTER TABLE 方法。

ALTER table cat ALTER id set DEFAULT nextval('id_col_AI');

使用 PostgreSQL AUTO_INCREMENT 中的 GENERATED { BY DEFAULT || ALWAYS} AS 子句

你也可以使用以下程式碼新增自動遞增列。

id integer generated by default as identity

我們使用 BY DEFAULT 而不是 ALWAYS,因為前者傾向於寫入使用者值,但後者只允許系統指定的值。你也可以使用 ALWAYS

在許多系統中,它可能會完美執行。但是,如果使用 ALWAYS 在插入時返回錯誤,請在 INSERT 子句中附加 OVERRIDING SYSTEM VALUE 以允許使用者特定的值。

insert into cat (color) overriding system value
values('black'), ('white'), ('brown'), ('tuxedo');

這使用了一個自動附加的序列,例如前面提到的隨機生成器。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub