1.三种方法
-
AUTO_INCREMENT
-
IDENTITY
-
SEQUENCE
2.简单对比
-
AUTO_INCREMENT 或 IDENTITY 字段都是直接在表定义时设定的, SEQUENCE是一个独立的对象
-
AUTO_INCREMENT 可以设定的参数最少, 不能设定起始值和增量
-
IDENTITY 可设定的参数稍微多一些, 能设定起始值和增量
-
SEQUENCE可设定的参数很多
-
AUTO_INCREMENT 和 IDENTITY使用起来方便,但是灵活性没有SEQUENCE高
3.推荐使用SEQUENCE的原因
-
如果某个表有 AUTO_INCREMENT 或 IDENTITY 栏位, 在有删除记录的情况下, 再复制一个新表, 新表 id 和 原表 id 就不一致了
-
Vertica 建表 DDL 中, 可以为 id 栏位设定默认值为某个SEQUENCE, 这样方便性就和 AUTO_INCREMENT 或 IDENTITY 一样了
-
quence 可以有更多的调优手段, 比如某个表经常要做 bulk copy, 可以为 seq 设定较大的 cache, 以提升 copy 的速度, 如果表的插入频率不大, 可以将 seq 的 cache 设的小一些, 以减少内存的使用
-
推荐每一个表单独使用一个SEQUENCE
4.SEQUENCE语法
CREATE SEQUENCE [ IF NOT EXISTS ] [[database.]schema.]sequence
... [ INCREMENT [ BY ] integer ]
... [ MINVALUE integer | NO MINVALUE ]
... [ MAXVALUE maxvalue | NO MAXVALUE ]
... [ START [ WITH ] integer ]
... [ CACHE integer | NO CACHE ]
... [ CYCLE | NO CYCLE ]
默认指定每个节点每个缓存设置250000个编号,不推荐使用NO CACHE的设置,虽然能够使序列递增+1,但是性能会受到严重的影响,每次+1都会有分布式锁。在vsql中使用序列SEQUENCE进行INSERT时,需要最后执行commit提交,但是jdbc中是自动commit的。
5.使用示例
(1)创建和删除序列
DROP SEQUENCE IF EXISTS test.version_sequence;
CREATE SEQUENCE test.version_sequence INCREMENT BY 1 START WITH 1;
(2)建表使用序列
-- 删除序列时,如果有依赖的表,那么将不能被删除,需要先删除表,再删除序列
-- 创建表,主键使用序列
CREATE TABLE test.version
(
id int DEFAULT NEXTVAL('test.version_sequence'),
version varchar(255) NOT NULL,
detailed_version varchar(255) NOT NULL,
parent_version varchar(255),
procedure_name varchar(255),
function_name varchar(255),
PRIMARY KEY(id)
);
(3)插入语句
INSERT INTO test.version (id,version,detailed_version,parent_version,procedure_name,function_name)
VALUES (default,'1.0.0','D991','','','');