📚 目录

  1. 概述
  2. 序列(Sequence)概念
  3. 自动增长的实现方式
  4. 使用 SERIAL 数据类型
  5. 使用 BIGSERIAL 数据类型
  6. 自定义序列
  7. 参考资料

🛠️ 概述

在 PostgreSQL 中,自动增长(Auto Increment) 是一种用于自动生成唯一数字的机制,通常用于表中的主键列。它确保每次插入新记录时,主键的值会自动递增,从而避免手动输入和重复值的情况。

PostgreSQL 使用 序列(Sequence) 来实现自动增长功能。序列是一个独立的对象,用于生成一系列的数字。虽然 SQL 标准中没有自动增长的直接支持,但 PostgreSQL 通过 SERIALBIGSERIAL 数据类型简化了这一操作。


📝 序列(Sequence)概念

在 PostgreSQL 中,序列是一个专门的数据库对象,用于生成连续的数字序列。每当一个插入操作需要一个新的唯一值时,数据库会从序列中获取一个新的值。

通过序列,PostgreSQL 实现了自动增长功能,尽管背后是通过手动控制的方式来生成和管理序列。


📝 自动增长的实现方式

PostgreSQL 提供了两种主要的方式来实现自动增长:

  1. 使用 SERIAL 数据类型SERIAL 是一种常见的实现方式,它自动创建一个序列并将其与表的列关联起来。
  2. 使用自定义序列:你也可以手动创建一个序列,并将其值与表的列关联,从而控制序列的生成。

📝 使用 SERIAL 数据类型

SERIAL 是 PostgreSQL 为简化自动增长操作而提供的一种特殊数据类型。它是一个整数类型,用于在插入新行时自动生成唯一的整数值。SERIAL 其实只是一个简化的语法,它会自动创建一个序列,并在插入时使用该序列来填充字段。

语法:

CREATE TABLE table_name (
    column_name SERIAL PRIMARY KEY
);

这个命令会做以下几件事:

  1. 创建一个整数类型的列。
  2. 创建一个与该列相关联的序列。
  3. 使用该序列为该列提供自动增长的值。

示例:

CREATE TABLE employees (
    employee_id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    salary NUMERIC
);

在此示例中,employee_id 列会自动增长,每次插入一行时,employee_id 会自动递增。


📝 使用 BIGSERIAL 数据类型

BIGSERIAL 数据类型与 SERIAL 相似,但它使用的是 BIGINT 类型,适用于需要更大范围整数值的情况(通常当预计数据表会存储大量数据时使用)。

语法:

CREATE TABLE table_name (
    column_name BIGSERIAL PRIMARY KEY
);

示例:

CREATE TABLE large_employees (
    employee_id BIGSERIAL PRIMARY KEY,
    name VARCHAR(100),
    salary NUMERIC
);

employee_id 列将使用 BIGSERIAL 类型,允许存储更大的整数值,适合于大数据量的场景。


📝 自定义序列

如果你希望更精确地控制序列的行为(如起始值、增量等),可以创建一个自定义的序列并将其与表的列关联。

1. 创建序列

CREATE SEQUENCE seq_employee_id
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

此命令创建了一个名为 seq_employee_id 的序列,初始值为 1,每次递增 1。

2. 将序列与表的列关联

CREATE TABLE employees (
    employee_id INT PRIMARY KEY DEFAULT nextval('seq_employee_id'),
    name VARCHAR(100),
    salary NUMERIC
);

在此示例中,employee_id 列使用了自定义的 seq_employee_id 序列。每次插入数据时,employee_id 会自动从序列中获取下一个值。


🛠️ 设置序列的当前值

如果你希望手动设置序列的当前值(例如,在删除所有数据后重新开始),可以使用 setval 函数:

SELECT setval('seq_employee_id', 1, false);

  • 第一个参数是序列的名称。
  • 第二个参数是你希望设置的当前值。
  • 第三个参数设置是否让下一个 nextval 调用返回指定值。如果是 false,则下一个返回的值为 1;如果是 true,则会返回指定值。

📘 参考资料