提要:在本教程中,我们将向您介绍PostgreSQL 的 SERIAL,并向您展示如何使用它在数据表中创建自动增长的字段。

SERIAL 伪类型简介

在PostgreSQL中,序列是一种特殊的数据库对象,它产生一个整数序列。序列通常用于主键字段。PostgreSQL 中的序列和 MySQL 中的 AUTO_INCREMENT 类似。

下面,我们将通过 SERIAL 伪类型来创建一个序列:

CREATE TABLE table_name(
    id SERIAL
);

在将 id 字段和 SERIAL 伪类型进行关联时,PostgreSQL 做了以下事:

  • 创建一个序列对象,并将该序列生成的下一个值设置为该字段的默认值
  • 给字段添加非空约束。因为序列始终返回一个非空的整数
  • id 字段设置为序列对象的所有者。当 id 字段或整张表被删除时,这个序列对象也会随之并删除

语句:

CREATE TABLE table_name(
    id SERIAL
);

在幕后做了以下事:

CREATE SEQUENCE table_name_id_seq;

CREATE TABLE table_name (
    id integer NOT NULL DEFAULT nextval('table_name_id_seq')
);

ALTER SEQUENCE table_name_id_seq
OWNED BY table_name.id;

PostgreSQL 提供了三种序列的伪类型:SMALLSERIALSERIALBIGSERIAL

伪类型 存储大小 范围
SMALLSERIAL 2字节 1 到 32,767
SERIAL 4字节 1 到 2,147,483,647
BIGSERIAL 8字节 1 到 922,337,2036,854,775,807

示例

需要注意的是,SERIAL 不会隐式地在字段上创建索引或将字段变为主键。但是,通过为 SERIAL 字段指定 PRIMARY KEY 约束,可以轻松完成此操作。

下面的语句创建一个 fruits 表,它有一个 SERIAL 类型的 id 字段:

CREATE TABLE fruits(
   id SERIAL PRIMARY KEY,
   name VARCHAR NOT NULL
);

要将序列的值给对应的字段,在插入数据的时候,不要写上 SERIAL 字段,或使用 DEFAULT 关键字。

如下所示:

INSERT INTO fruits(name) VALUES('orange');

以及:

INSERT INTO fruits(id,name) VALUES(DEFAULT,'apple');

要获取表中序列的名称,可以使用如下语句:

pg_get_serial_sequence('table_name','column_name')

你可以将序列的名字传递给 currval() 函数,它将返回该序列最后生的值:

SELECT currval(pg_get_serial_sequence('fruits', 'id'));

结果如下:

currval
---------
2
(1 row)

如果想在执行 INSERT 的同时,获取序列生成的值(换句话,获取最后插入的ID),可以在 INSERT 语句后面加上 RETURNING id 子句:

INSERT INTO fruits(name) VALUES('banana')
RETURNING id;

结果:

id
----
3
(1 row)

注意,RETURNING id 里的 id 是数据表主键的字段名。如果你的表的主键是 sjk66_id,那么你应该写成 RETURNING sjk66_id

上一篇:PostgreSQL 整型
下一篇:PostgreSQL DATE类型