PostgreSQL 中的自动递增值

Bilal Shahid 2024年2月15日
  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