PostgreSQL数据库实现表字段的自增

在使用MySQL的时候,创建表结构时可以通过关键字AUTO_INCREMENT来指定主键是否自增。在PostgreSQL数据库中,使用序列来实现字段的自增。

PostgreSQL序列是一种特殊的用于生产整数序列数据库对象。序列通常用于主键列,与mysql的AUTO_INCREMENT 概念类似。

PostgreSQL 提供三种序列伪类型,分别为SMALLSERIAL, SERIAL, BIGSERIAL,对应范围如下:

Name Storage Size Range
SMALLSERIAL 2 bytes 1 to 32,767
SERIAL 4 bytes 1 to 2,147,483,647
BIGSERIAL 8 bytes 1 to 922,337,2036,854,775,807

创建表时使用SERIAL伪类型定义序列:

CREATE TABLE table_name(
    id SERIAL
);

赋值serial伪类型给id列,PostgreSQL将执行下列步骤:

  • 创建序列对象并设置下一个生成值作为列的缺省值。
  • 给对应列增加NOT NULL约束,因为序列总是生成一个整数值,不能为null值。
  • 赋值序列的拥有者给id列,因此当id列或表被删除时,序列对象自动被删除。

对应背后执行语句:

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;

创建表时设置主键自增

创建表

CREATE TABLE student
(
    id   SERIAL PRIMARY KEY,
    name VARCHAR
);

插入数据

可以忽略对应列或使用default关键字都可以给serial赋值

INSERT INTO student(name) VALUES ('小明');

INSERT INTO student(id, name) VALUES (DEFAULT, '小红');

修改已有表主键为自增

已有表结构

CREATE TABLE student
(
    id   int4 PRIMARY KEY,
    name VARCHAR
);

创建序列

CREATE SEQUENCE student_id_seq START 1;

代码中的1表示此主键从1开始,注意:如果项目中的表已经有数据,那么START 后边的数字一定要比数据库中的主键字段的最大值要大或者相同

修改主键默认值

ALTER TABLE student
    ALTER COLUMN id SET DEFAULT nextval('student_id_seq'::regclass);

也可使用Navicat设计表修改字段默认值
PostgreSQL数据库实现表字段的自增_第1张图片

自增量从 SERIAL 修改为 SERIAL8

1.字段类型调整为 int8

ALTER TABLE student  ALTER COLUMN "id" TYPE int8;

2.创建sequence, 起始值从当前表中选取

CREATE SEQUENCE student_id_seq8 START WITH max_Id;

max_Id 为当前表中最大值,表中无数据可设置为1
查询最大ID值: SELECT MAX("id") FROM student;

3.将表的自增量主键字段 默认值置为null

ALTER TABLE student ALTER COLUMN "id" SET DEFAULT NULL;

4.设置默认值为新的 sequence

ALTER TABLE student ALTER COLUMN "id" SET DEFAULT nextval('student_id_seq8'::regclass)

5.可以删除原来的sequence

DROP SEQUENCE student_id_seq;

你可能感兴趣的:(PostgreSQL数据库,数据库,postgresql,mysql)