自增长列和序列的区别(identity与quence的区别)

更新时间:2023-05-20 14:52:58 阅读: 评论:0

⾃增长列和序列的区别(identity与quence的区别)
----------------------------------------------------------------
identity 和quence的区别:
----------------------------------------------------------------
db2,sql rver 都不⽀持⼀个表中包含两个以及两个以上的identity字段
oracle 不⽀持idenity字段
sql rver不⽀持quence⽤法
db2 ⽀持quence,identity的两种⽤法
identity因为只能在⼀个table中⽤⼀次。
但是⼀个quence可以在⼀张表中的多个字段多被⽤到。
upt是什么意思
----------------------------------------------------------------
db2 使⽤⽅法:(⽀持quence,identity)
----------------------------------------------------------------
参考资料: /developerworks/cn/data/library/techarticles/0302fielding/0302fielding.html
identity :(两种使⽤⽅法)
1. Select IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
2.CREATE TABLE WBIA_JDBC_EventStore
(
event_id                        INTEGER NOT NULL    GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE )      PRIMARY KEY,
)
quence:(两种使⽤⽅法)
CREATE SEQUENCE orders_q AS INT  START WITH 1 INCREMENT BY 1  MINVALUE 1 NO MAXVALUE NO CYCLE  NO CACHE ORDER
1.values nextval for $quenceName$
INSERT INTO customer_orders_t
VALUES
(
NEXT VALUE FOR orders_q,
....
)
复杂的实验内容:(⼀个表中有⼀个⾃增长的字段,另外两个字段都⽤quence来插⼊数据)下⾯sql语句得到正常运⾏
drop quence quence1;
drop quence quence2;
CREATE SEQUENCE quence1 AS INT  START WITH 1 INCREMENT BY 1  MINVALUE 1 NO MAXVALUE NO CYCLE  NO CACHE ORDER; CREATE SEQUENCE quence2 AS INT  START WITH 1 INCREMENT BY 1  MINVALUE 1 NO MAXVALUE NO CYCLE  NO CACHE ORDER;
drop table temp;
CREATE TABLE temp
(
event_id        INTEGER NOT NULL    GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE )
广州健康管理师培训PRIMARY KEY,
xid                VARCHAR(200),
object_key        VARCHAR(80)    ,
object_name        VARCHAR(40)    ,
object_function    VARCHAR(40)    ,
event_priority  INTEGER        ,
event_time        TIMESTAMP    default CURRENT TIMESTAMP NOT NULL,
event_status    INTEGER        ,
event_comment    VARCHAR(100)
);
inrt into temp(event_priority,event_status) values(NEXT VALUE FOR quence1, NEXT VALUE FOR quence2);
inrt into temp(event_priority,event_status) values(NEXT VALUE FOR quence1, NEXT VALUE FOR quence1);
inrt into temp(event_priority,event_status) values(NEXT VALUE FOR quence2, NEXT VALUE FOR quence2);
lect event_id,event_priority,event_status from temp;
----------------------------------------------------------------
oracle 使⽤⽅法:(只⽀持quence)
----------------------------------------------------------------
CREATE SEQUENCE event_quence start with 1;
1.lect $quenceName$.nextval from dual
INSERT INTO  wbia_jdbc_eventstore (event_id, object_key, object_name, object_function, event_priority, event_status)
VALUES(val, :NEW.pkey, 'InDb2adminCustomerBG', 'Create', 1, 0);
复杂的实验内容:(⼀个表中有两个字段都⽤quence来插⼊数据)下⾯sql语句得到正常运⾏
drop quence quence1;
drop quence quence2;
CREATE SEQUENCE quence1 start with 1;
CREATE SEQUENCE quence2 start with 1;
drop table temp;
CREATE TABLE temp
(
event_id NUMBER(20) PRIMARY KEY,
xid  VARCHAR2(200),
object_key VARCHAR2(80),
object_name  VARCHAR2(40),
leave的过去式object_function VARCHAR2(40),
event_priority NUMBER(5) ,
event_time    DATE DEFAULT SYSDATE NOT NULL,
event_status NUMBER(5),
event_comment VARCHAR2(100)
);
inrt into temp(event_id,event_priority,event_status) val, val); inrt into temp(event_id,event_priority,event_status) val, val); inrt into temp(event_id,event_priority,event_status) val, val); lect event_id,event_priority,event_status from temp;
----------------------------------------------------------------
sql rver identity 使⽤⽅法:(只⽀持identity)
----------------------------------------------------------------
CREATE TABLE WBIA_JDBC_EVENTSTORE (
event_id        DECIMAL(20) IDENTITY(1,1)    PRIMARY KEY,
)
复杂的实验内容:(⼀个表中有⼀个⾃增长的字段,不允许两个以上⾃增长的列)下⾯sql语句得到正常运⾏
drop table temp;
succeeds
CREATE TABLE temp
(
event_id        INT NOT NULL    PRIMARY KEY,
event_priority  DECIMAL(20) IDENTITY(1,1)  ,
-- event_status    INT IDENTITY(2,1)  , --Multiple identity columns specified for table 'temp'. Only one identity column per table is allowed.
);
inrt into temp(event_id) values(1);
inrt into temp(event_id) values(2);
lect event_id,event_priority from temp;
create quence q_test
minvalue 10000
staplesmaxvalue 99999999999999999
start with 20000
increment by 1
cache 20
cycle
order;
DB2的写法:
create quence q_test
as bigint
start with 20000
少儿英语教材increment by 1
minvalue 10000
maxvalue 99999999999999999
cycle
cache 20
order;
PostgreSQL的写法:
create quence q_test
laodaincrement by 1
minvalue 10000
maxvalue 99999999999999999
start 20000
cache 20
cycle;
⼆、Oracle、DB2、PostgreSQL数据库Sequence值的引⽤参数为:currval、nextval,分别表⽰当前值和下⼀个值。下⾯分别从三个数据库的Sequence中获取nextval的值。
Oracle中:val
例如:lect val from dual;
DB2中:nextval for SEQ_TOPICMS
例如:values nextval for q_test;
PostgreSQL中:nextval(q_test)
例如:lect nextval(q_test);
三、Sequence与indentity的区别与联系
Sequence与indentity的基本作⽤都差不多。都可以⽣成⾃增数字序列。
Sequence是数据库系统中的⼀个对象,可以在整个数据库中使⽤,和表没有任何关系;indentity仅仅是指定在表中某⼀列上,作⽤范围就是这个表。
四、postgresql中的Sequence分配策略(postgresql8.3.x)
调⽤lect nextval(q_test);后,系统马上分配⼀个序号给⽤户,然后系统的次Sequence马上加上之前设置的步长(increment by 1),不论此序号⽤户是否使⽤。
调⽤lect currval(q_test);返回当前的序列号,该序列号只要没有使⽤,就不会变化,直到被使⽤后,才会变化,并且该序列号已经分配给当前请求,不会
再分配给其他的请求。
所以,减少浪费时,使⽤currval,不在乎浪费,⽽且id不连续的话,可以使⽤nextval。因为⼀旦分配给你后,使⽤失败,将会把该序列号丢弃!
ORACLE SEQUENCE的简单介绍
在oracle中quence就是所谓的序列号,每次取的时候它会⾃动增加,⼀般⽤在需要按序列号排序的地⽅。
1、Create Sequence
你⾸先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,
十二月英语CREATE SEQUENCE emp_quence
INCREMENT BY 1 -- 每次加⼏个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最⼤值
NOCYCLE -- ⼀直累加,不循环
CACHE 10;
⼀旦定义了emp_quence,你就可以⽤CURRVAL,NEXTVAL
CURRVAL=返回 quence的当前值
NEXTVAL=增加quence的值,然后返回 quence 值
⽐如:
emp_quence.CURRVAL
emp_quence.NEXTVAL
可以使⽤quence的地⽅:
broadspectrum-
不包含⼦查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的⼦查询中
- NSERT语句的VALUES中
- UPDATE 的 SET中
可以看如下例⼦:
中国日语INSERT INTO emp VALUES
(val, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
SELECT empq.currval FROM DUAL;
但是要注意的是:
- 第⼀次NEXTVAL返回的是初始值;随后的NEXTVAL会⾃动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第⼀次NEXTVAL初始化之后才能使⽤CURRVAL,否则会出错。⼀次NEXTVAL会增加⼀次 SEQUENCE的值,所以如果你在同⼀个
语句⾥⾯使⽤多个NEXTVAL,其值就是不⼀样的。明⽩?
- 如果指定CACHE值,ORACLE就可以预先在内存⾥⾯放置⼀些quence,这样存取的快些。cache⾥⾯的取完后,oracle⾃动再取⼀组 到cache。 使⽤cache或许会跳号, ⽐如数据库突然不正常down掉(shutdown abort),cache中的quence就会丢失. 所以可以在create quence的时候⽤nocache防⽌这种情况。
2、Alter Sequence
你或者是该quence的owner,或者有ALTER ANY SEQUENCE 权限才能改动quence. 可以alter除start⾄以外的所有quence参数.如果想要改变start值,必须 drop quence 再 re-create .
Alter quence 的例⼦
ALTER SEQUENCE emp_quence
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 到10000后从头开始
NOCACHE ;
影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的quence数⽬。
可以很简单的Drop Sequence
DROP SEQUENCE order_q;

本文发布于:2023-05-20 14:52:58,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/115920.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:序列号   分配   字段   参数   内存   内容
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图