📚 目录
🛠️ 概述
在 PostgreSQL 中,自动增长(Auto Increment) 是一种用于自动生成唯一数字的机制,通常用于表中的主键列。它确保每次插入新记录时,主键的值会自动递增,从而避免手动输入和重复值的情况。
PostgreSQL 使用 序列(Sequence) 来实现自动增长功能。序列是一个独立的对象,用于生成一系列的数字。虽然 SQL 标准中没有自动增长的直接支持,但 PostgreSQL 通过 SERIAL
和 BIGSERIAL
数据类型简化了这一操作。
📝 序列(Sequence)概念
在 PostgreSQL 中,序列是一个专门的数据库对象,用于生成连续的数字序列。每当一个插入操作需要一个新的唯一值时,数据库会从序列中获取一个新的值。
通过序列,PostgreSQL 实现了自动增长功能,尽管背后是通过手动控制的方式来生成和管理序列。
📝 自动增长的实现方式
PostgreSQL 提供了两种主要的方式来实现自动增长:
- 使用
SERIAL
数据类型:SERIAL
是一种常见的实现方式,它自动创建一个序列并将其与表的列关联起来。 - 使用自定义序列:你也可以手动创建一个序列,并将其值与表的列关联,从而控制序列的生成。
📝 使用 SERIAL
数据类型
SERIAL
是 PostgreSQL 为简化自动增长操作而提供的一种特殊数据类型。它是一个整数类型,用于在插入新行时自动生成唯一的整数值。SERIAL
其实只是一个简化的语法,它会自动创建一个序列,并在插入时使用该序列来填充字段。
语法:
CREATE TABLE table_name (
column_name SERIAL PRIMARY KEY
);
这个命令会做以下几件事:
- 创建一个整数类型的列。
- 创建一个与该列相关联的序列。
- 使用该序列为该列提供自动增长的值。
示例:
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
,则会返回指定值。
📘 参考资料
- PostgreSQL 官方文档:SERIAL 数据类型
- 更多 PostgreSQL 技巧整理自:www.52kanjuqing.com
发表回复