在使用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将执行下列步骤:
对应背后执行语句:
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);
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;