postgresql自增的简单介绍-成都快上网建站

postgresql自增的简单介绍

postgreSQL怎样创建一个序列号/自动递增的字段

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。 1、Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限, CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 CACHE 10; 一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL CURRVAL=返回 sequence的当前值 NEXTVAL=增加sequence的值,然后返回 sequence 值 比如: emp_sequence.CURRVAL emp_sequence.NEXTVAL 可以使用sequence的地方: - 不包含子查询、snapshot、VIEW的 SELECT 语句 - INSERT语句的子查询中 - NSERT语句的VALUES中 - UPDATE 的 SET中 可以看如下例子: INSERT INTO emp VALUES (empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20); SELECT empseq.currval FROM DUAL; 但是要注意的是: - 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白? - 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。 2、Alter Sequence 你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create . Alter sequence 的例子 ALTER SEQUENCE emp_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE -- 到10000后从头开始 NOCACHE ; 影响Sequence的初始化参数: SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。 可以很简单的Drop Sequence DROP SEQUENCE order_seq; 示例Sequence: CREATE SEQUENCE SCOTT.DMIFPOSTID START WITH 261 INCREMENT BY 1 NOMINVALUE NOMAXVALUE NOCYCLE CACHE 20 NOORDER 3、如何使用 第一种方法:一般来说需要新建一个触发器(TRIGGER),使得在插入数据之前先运行Sequence生成自增号。示例Trigger -- Create table create table TEST ( SEQ INTEGER not null, NAME VARCHAR2(20), PWD VARCHAR2(20) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table TEST add constraint PK_TEST primary key (SEQ) using index tablespace USERS pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); create or replace trigger TI_TEST before insert on test for each row declare -- local variables here begin SELECT SEQ_TEST.NEXTVAL INTO :NEW.SEQ FROM DUAL; end TI_TEST; 插入语句 insert into test values('aa','aa'); 第二种方法:可以在插入数据时直接调用。 insert into table(id,name) values(seq_name.nextval,'名字');

成都创新互联公司专注于企业全网整合营销推广、网站重做改版、道外网站定制设计、自适应品牌网站建设、html5成都商城网站开发、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为道外等各大城市提供网站开发制作服务。

postgresqlsql 中有没有sql语句可以知道一个属性的值是不是采用自增的方式填充的?

如何判断表中是否存在SQL自增列呢?这是很多人都提到过的问题,下面就为您介绍判断表中是否存在SQL自增列的实现方法,供您参考。

判断Table是否存在SQL自增列(Identity column):

declare @Table_name varchar(60)

set @Table_name = '';

if Exists(Select top 1 1 from sysobjects

Where objectproperty(id, 'TableHasIdentity') = 1

and upper(name) = upper(@Table_name)

)

select 1

else select 0

-- or

if Exists(Select top 1 1 from sysobjects so

Where so.xtype = 'U'

and upper(so.name) = upper(@Table_name)

and Exists(Select Top 1 1 from syscolumns sc

Where sc.id = so.id

and columnproperty(sc.id, sc.name, 'IsIdentity') = 1

)

)

select 1

else select 0

判断Table是否存在自增列(Identity column),并查出自增列相关数据:

declare @Table_name varchar(60)

set @Table_name = '';

为什么PostgreSQL的自增ID是非连续的

就像mysql 的uuid一样,每次select nextval('user_seq')都会自动递增的。就像楼主所说,可能你的事务没成功,但seq不会回滚,除非你rockback的时候设置一下seq

INSERT INTO my_users(u_id,u_name)VALUES(nextval('user_seq'),'oschina');

如何设置Hibernate4+PostgreSQL中的自增字段

自增列不能直接修改,必须将原有ID列删除,然后重新添加一列具有identity属性的ID字段。比如你要修改的

字段名

为ID:alter

table

表名

drop

column

IDalter

table

表名

add

ID

int

identity(1,1)

如何在postgresql中添加id自增列

使用 serial 来处理。

CREATE TABLE test_create_tab2 (

id SERIAL,

val VARCHAR(10)

);

Test=# CREATE TABLE test_create_tab2 (

Test(# id SERIAL,

Test(# val VARCHAR(10)

Test(# );

注意: CREATE TABLE 将为 serial 字段 "test_create_tab2.id" 创建隐含序列 "test_create_tab2_id_seq"

CREATE TABLE

Test=# \d test_create_tab2;

资料表 "public.test_create_tab2"

栏位 | 型别 | 修饰词

------+-----------------------+-------------------------------------------------

-------

id | integer | 非空 缺省 nextval('test_create_tab2_id_seq'::regclass)

val | character varying(10) |

Test=# INSERT INTO test_create_tab2(val) VALUES ('NO id');

INSERT 0 1

Test=# INSERT INTO test_create_tab2(val) VALUES ('NO id 2');

INSERT 0 1

Test=# select * from test_create_tab2;

id | val

----+---------

1 | NO id

2 | NO id 2

(2 行记录)

Test=# select lastval();

lastval

---------

2

(1 行记录)

PostgreSQL 中 sequence 的用法

sequence 是 pg 自带的高效的自增id工具(也叫序列)。sequence 使用了轻量级锁的方式来做到高效自增id的,所以会比 UPDATE 行锁快。sequence 的返回数据类型默认是64位的整数,pg 10 可以自定 smallint, integer 或者是 bigint。

sequence 是可以保证自增数据不重复的,也就是说每次自增后都会持久化保存,那么为了继续提高性能,可以加上 CACHE 参数(默认为1),每个进程(连接)可以缓存一个子序列在当前进程内存里面,当子序列用完了才会去原序列取新的子序列。

这个用个例子简单说一下,创建 sequence temp_seq3 时用了 CACHE 10,A session 可以获取到的值是 1...10,B session 可以获取到的值是 11...20,那么获取顺序可能是 (A, A, B, A),返回值是 (1, 2, 11, 3),这个不是严格自增的序列,但可以保证回次返回都是唯一的,用了 CYCLE 参数的除外。

根据文档和源码( link 第80行),缓存在内存里面的最大值(cached)是每个进程都不一样的,所以如果要求严格自增的服务不能用 CACHE。

这里写三种用 pg 做自增id的方式

测试命令,在 MacOS 上用 docker 开一个 pg 在里面运行一下 pgbench 脚本,其中 sql.sql 的内容替换成对应的压测脚本。

TPS: 986

TPS: 7332

TPS: 7451

看看微信的分布式id生成器,原理都差不多,"实际应用中每次提升的步长为10000" = "CACHE 10000"。 link

以上优化已经是用在友好速搭电商系统的订单号和优惠券号生成服务中,为商家提供更快更可靠的服务。


新闻标题:postgresql自增的简单介绍
标题链接:http://kswjz.com/article/dscpoio.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流