人大金仓kingbase数据库自增序列替换AUTO_INCREMENT

/ 0条评论 / 0 个点赞 / 884人阅读

下面阐述由MySQL的AUTO_INCREMENT如何转换为人大金仓数据库不能使用MySQL的AUTO_INCREMENT来添加数据库自动自增。人大金仓数据库有自己的自增序列方法。

人大金仓定义了三种序列类型分别是smallserial、serial、bigserial,他们分别对应的为int2,int4,int8类型。

创建自增序列

例如:在int8类型上增加序列。有两种方法,第一种是直接使用序列类型定义字段;第二中是使用普通类型字段,但需要另外显示定义序列。

1.1 使用序列类型定义字段

-- 使用bigserial时,数据库会默认创建一个名为user_id_seq(表名_字段名_sql)的序列
DROP TABLE IF EXISTS "user";
CREATE TABLE "user"(
	"id" bigserial NOT NULL,
	"user_name" varchar(20 char) NOT NULL,
	"age" int4,
	CONSTRAINT "user_pk" PRIMARY KEY (id);
);

手动创建序列,等价于上面语句

CREATE SEQUENCE user_id_seq;
DROP TABLE IF EXISTS "user";
CREATE TABLE "user"(
	"id" int8 NOT NULL DEFAULT nextval('user_id_seq'),
	"user_name" varchar(20 char) NOT NULL,
	"age" int4,
            	CONSTRAINT "user_pk" PRIMARY KEY (id);
);
ALTER SEQUENCE user_id_seq OWNED BY "user"."id";

序列类型与基本数据类型的对于

序列名普通类型内存大小自增序列范围
smallserialsmallint/int22字节1到32767
serialinteger/int44字节1到2147483647
bigserialbigint/int88字节1到9223372036854775807

序列函数

函数返回类型描述
currval(regclass)bigint返回最近一次用nextval获取的指定序列的值
lastval()bigint返回最近一次用nextval获取的任何序列的值
nextval(regclass)bigint递增序列并返回新值
setval(regclass, bigint)bigint设置序列的当前值
setval(regclass, bigint, boolean)bigint设置序列的当前值以及is_called标志

使用

例如:向1.1中的user表添加数据

insert into user("user_name","age") values("张三", 25);
insert into user("id","user_name","age") values(nextval('user_id_seq'),"李四", 22);