oracle表主键递增的创建
- 格式:docx
- 大小:12.50 KB
- 文档页数:1
oracle设置⾃动增长序列我们在⽤MS SQL Server时,可以为表的主键设置为⾃动加1的效果;但是在Oracle当中,我们是⽆法直接设置⼀个字段为⾃动加1,需要先建⽴⼀个Sequence,然后为这个表创建⼀个Trigger,具体步骤如下:1.先建⽴⼀个Order表格,⽤如下SQL语句create table SCOTT.ORDER(ID NUMBER(10) not null,BUYER CHAR(20) not null,MERCHANDISE VARCHAR2(50) not null,QUANTITY LONG not null,UNITPRICE NUMBER(10,2) not null,TOTALPRICE NUMBER(20,4),DESCRIPTION NVARCHAR2(1000),PRIMARY KEY("ID"))2.创建⼀个序列,从10000开始计数,增量为1create sequence ORDER_IDminvalue 1maxvalue 9999999999999999999999999999start with 10000 --从10000开始⽣成序列increment by 1 --增量为1cache 20; --预存20个序列值在内存中,这样可以提⾼访问序列的速度3.为Order表创建⼀个before insert的触发器,在插⼊之前将表order的主键设置为上⾯的序列值.CREATE OR REPLACE TRIGGER "ORDER_ID_GENERATOR" BEFOREINSERT ON "SCOTT"."ORDER" FOR EACH ROW --⼀定要加上For each row,表⽰该触发器适应于每⼀条记录declaremid number;beginselect order_id.nextval into mid from dual; --order_id.nextval是获得上⾯定义的序列ORDER_ID的下⼀个值:new.id:=mid; --将得到的序列值赋给表order的主键id, 可以⽤":new"引⽤将要插⼊的⼀⾏数据end;这样,当执⾏插⼊记录的时候,可以这样写insert into order(buyer,merchandise,quantity,unitprice)values("ABC","Product_ABC",200,10);Oracle会调⽤上⾯创建的触发器将序列值赋值给主键ID。
Oracle之主键的创建、添加、删除操作⼀、创建表的同时创建主键约束1.1、⽆命名SQL> create table jack (id int primary key not null,name varchar2(20));Table createdSQL> select table_name,index_name from user_indexes where table_name='JACK';TABLE_NAME INDEX_NAME------------------------------ ------------------------------JACK SYS_C00111001.2、有命名SQL> create table jack (id int ,name varchar2(20),constraint ixd_id primary key(id));Table createdSQL> select table_name,index_name from user_indexes where table_name='JACK';TABLE_NAME INDEX_NAME------------------------------ ------------------------------JACK IXD_ID⼆、向表中添加主键约束SQL> create table jack as select * from dba_objects;Table createdSQL> desc jack;Name Type Nullable Default Comments-------------- ------------- -------- ------- --------OWNER VARCHAR2(30) YOBJECT_NAME VARCHAR2(128) YSUBOBJECT_NAME VARCHAR2(30) YOBJECT_ID NUMBER YDATA_OBJECT_ID NUMBER YOBJECT_TYPE VARCHAR2(19) YCREATED DATE YLAST_DDL_TIME DATE YTIMESTAMP VARCHAR2(19) YSTATUS VARCHAR2(7) YTEMPORARY VARCHAR2(1) YGENERATED VARCHAR2(1) YSECONDARY VARCHAR2(1) YNAMESPACE NUMBER YEDITION_NAME VARCHAR2(30) YSQL> alter table jack add constraint pk_id primary key(object_id);Table alteredSQL> select table_name,index_name from user_indexes where table_name='JACK';TABLE_NAME INDEX_NAME------------------------------ ------------------------------JACK PK_ID----另外当索引创建好以后再添加主键的效果:SQL> create table jack as select * from dba_objects;Table createdSQL> create index ind_object_id on jack(object_id);Index createdSQL> select table_name,index_name from user_indexes where table_name='JACK';TABLE_NAME INDEX_NAME------------------------------ ------------------------------JACK IND_OBJECT_IDSQL> desc jack;Name Type Nullable Default Comments-------------- ------------- -------- ------- --------OWNER VARCHAR2(30) YOBJECT_NAME VARCHAR2(128) YSUBOBJECT_NAME VARCHAR2(30) YOBJECT_ID NUMBER YDATA_OBJECT_ID NUMBER YOBJECT_TYPE VARCHAR2(19) YCREATED DATE YLAST_DDL_TIME DATE YTIMESTAMP VARCHAR2(19) YSTATUS VARCHAR2(7) YTEMPORARY VARCHAR2(1) YGENERATED VARCHAR2(1) YSECONDARY VARCHAR2(1) YNAMESPACE NUMBER YEDITION_NAME VARCHAR2(30) YSQL> alter table jack add constraint pk_id primary key(object_id);Table alteredSQL> desc jack;Name Type Nullable Default Comments-------------- ------------- -------- ------- --------OWNER VARCHAR2(30) YOBJECT_NAME VARCHAR2(128) YSUBOBJECT_NAME VARCHAR2(30) YOBJECT_ID NUMBERDATA_OBJECT_ID NUMBER YOBJECT_TYPE VARCHAR2(19) YCREATED DATE YLAST_DDL_TIME DATE YTIMESTAMP VARCHAR2(19) YSTATUS VARCHAR2(7) YTEMPORARY VARCHAR2(1) YGENERATED VARCHAR2(1) YSECONDARY VARCHAR2(1) YNAMESPACE NUMBER YEDITION_NAME VARCHAR2(30) YSQL> select table_name,index_name from user_indexes where table_name='JACK';TABLE_NAME INDEX_NAME------------------------------ ------------------------------JACK IND_OBJECT_ID三、修改主键约束3.1、禁⽤/启⽤主键SQL> select a.table_name,a.index_name,b.constraint_name,b.constraint_type,b.status from user_indexes a,user_constraints b where b.table_name='JACK'and a.table_name=b.table_name; TABLE_NAME INDEX_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS------------------------------ ------------------------------ ------------------------------ --------------- --------JACK PK_ID PK_ID P ENABLEDSQL> alter table jack disable primary key;Table alteredSQL> select a.table_name,a.index_name,b.constraint_name,b.constraint_type,b.status from user_indexes a,user_constraints b where b.table_name='JACK'and a.table_name=b.table_name; TABLE_NAME INDEX_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS------------------------------ ------------------------------ ------------------------------ --------------- --------SQL> alter table jack enable primary key;Table alteredSQL> select a.table_name,a.index_name,b.constraint_name,b.constraint_type,b.status from user_indexes a,user_constraints b where b.table_name='JACK'and a.table_name=b.table_name; TABLE_NAME INDEX_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS------------------------------ ------------------------------ ------------------------------ --------------- --------JACK PK_ID PK_ID P ENABLED3.2、重命名主键SQL> select a.table_name,a.index_name,b.constraint_name,b.constraint_type,b.status from user_indexes a,user_constraints b where b.table_name='JACK'and a.table_name=b.table_name; TABLE_NAME INDEX_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS------------------------------ ------------------------------ ------------------------------ --------------- --------JACK PK_ID PK_ID P ENABLEDSQL> alter table jack rename constraint pk_id to pk_jack_id;Table alteredSQL> select a.table_name,a.index_name,b.constraint_name,b.constraint_type,b.status from user_indexes a,user_constraints b where b.table_name='JACK'and a.table_name=b.table_name; TABLE_NAME INDEX_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS------------------------------ ------------------------------ ------------------------------ --------------- --------JACK PK_ID PK_JACK_ID P ENABLED四、删除表中已有的主键约束4.1、⽆命名----先利⽤user_cons_columns表查得主键名:SQL> select owner,constraint_name,table_name,column_name from user_cons_columns where table_name = 'JACK';OWNER CONSTRAINT_NAME TABLE_NAME COLUMN_NAME------------------------------ ------------------------------ ------------------------------ ----------------JACK SYS_C0011105 JACK IDSQL> select table_name,index_name from user_indexes where table_name='JACK';TABLE_NAME INDEX_NAME------------------------------ ------------------------------JACK SYS_C0011105SQL> alter table jack drop constraint SYS_C0011105;Table altered4.2、有命名SQL> select owner,constraint_name,table_name,column_name from user_cons_columns where table_name = 'JACK';OWNER CONSTRAINT_NAME TABLE_NAME COLUMN_NAME------------------------------ ------------------------------ ------------------------------ ------------------------JACK IXD_ID JACK IDSQL> alter table jack drop constraint IXD_ID;Table alteredSQL> select owner,constraint_name,table_name,column_name from user_cons_columns where table_name = 'JACK';OWNER CONSTRAINT_NAME TABLE_NAME COLUMN_NAME------------------------------ ------------------------------ ------------------------------ ------------------------。
select * from(select e.*,ROWNUM rnfrom (select * from emp order by empno) e)where rn between 1 and 10;select * from(select e.*,ROWNUM rnfrom (select * from emp order by empno) ewhere ROWNUM<=10)where rn>=1;首先,你要有一张表!CREA TE TABLE example(ID Number(4) NOT NULL PRIMARY KEY,NAME V ARCHAR(25),PHONE V ARCHAR(10),ADDRESS V ARCHAR(50));然后,你需要一个自定义的sequenceCREA TE SEQUENCE emp_sequenceINCREMENT BY 1 -- 每次加几个START WITH 1 -- 从1开始计数NOMAXV ALUE -- 不设置最大值NOCYCLE -- 一直累加,不循环NOCACHE -- 不建缓冲区以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,假如你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下假如你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但假如遭遇意外情况如当机了或Oracle死了,则下次取出的seq值将和上次的不连贯.(假如连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!)书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:CREA TE TRIGGER "触发器名称" BEFOREINSERT ON example FOR EACH ROW WHEN (new.id is null)beginselect emp_sequence.nextval into: new.id from dual;end;打完收工!下面你就试试插入数据吧!INSERT INTO example(Name,phone,address) V alues('Cao','56498543','Heibei');=============================================================ORACLE SEQUENCE的简单介绍(自增长字段)- -from:/BBS/user_file/2002-04-10/1018438701.htm在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
使用powerdesigner创建oracle数据库表,设置表主键列为自动增长powerdesigner 版本12.5创建表就不说了。
下面开始介绍设置自动增长列。
1 在表视图的列上创建。
双击表视图,打开table properties ———>columens ,双击要设置的列(显示列的序号的那个按钮,单击后,会显示横向的黑色箭头)。
打开column properties 对话框。
在‘general’ 项中,最下面,找到sequence,下拉框后面,有三个按钮就‘create’,‘select’,‘properties’。
新建的话就点击‘create' 打开sequence properties 对话框,general 中的name,code 随意修改切换到physical options 项,输入下面几项内容start with 1increment by 1minvalue 1maxvalue 根据自己需要决定是否要设定。
没有的话,选择no max valueno cache 勾选输入完后,点击应用。
创建完毕。
在preview 中可以看到相应的创建代码同时,在table properties———>preview 的创建代码中,自动加入了触发器trigger 的创建代码。
创建完成。
使用:到table properties———>preview 中拷贝table 的创建代码,赋值到plsql中执行。
提示:不知道是我的powerdesigner 设置问题还是怎么回事,table 的创建代码中没有自动加入sequence 的创建部分。
所以,还要到sequence properties ———>preview 中,把sequence的创建代码拷贝到表创建的代码中放到cteate table .... 和create trigger ...中间例如:create table G_EC_LotteryCategory (lcId NUMBER(3) not null,lcName NVARCHAR2(30),lcAbbr NVARCHAR2(20),constraint PK_G_EC_LOTTERYCATEGORY primary key (lcId))/create sequence Sequence_LotCateIDincrement by 1start with 1nomaxvalueminvalue 1nocache;create trigger tib_g_ec_lotterycategory before inserton G_EC_LotteryCategory for each rowdeclareintegrity_error exception;errno integer;errmsg char(200);dummy integer;found boolean;begin-- Column lcId uses sequence Sequence_LotCateIDselect Sequence_LotCateID.NEXTVAL INTO :new.lcId from dual;-- Errors handlingexceptionwhen integrity_error thenraise_application_error(errno, errmsg);end;/在plsql 中执行上端代码。
oralce表结构自增长列autoincrement在Oracle中,实现自增长列(Auto Increment)的功能通常使用序列(Sequence)和触发器(Trigger)。
Oracle没有像某些数据库(如MySQL)中的AUTO_INCREMENT 关键字来直接定义自增长列,但可以通过序列和触发器来实现类似的功能。
以下是使用序列和触发器在Oracle中创建自增长列的基本步骤:1.创建序列(Sequence):CREATE SEQUENCE your_sequence_nameSTART WITH 1INCREMENT BY 1NOMAXVALUE;这将创建一个名为your_sequence_name的序列,起始值为1,每次递增1。
2.创建表并使用触发器(Trigger)关联序列:CREATE TABLE your_table_name(id NUMBER PRIMARY KEY,other_columns...--其他列);CREATE OR REPLACE TRIGGER your_trigger_nameBEFORE INSERT ON your_table_nameFOR EACH ROWBEGINSELECT your_sequence_name.NEXTVAL INTO:new.id FROM dual;END;这里创建了一个名为your_table_name的表,其中id列被定义为主键,并且在表中创建了一个名为your_trigger_name的触发器。
该触发器会在每次插入新行之前触发,并使用序列your_sequence_name的NEXTVAL值为id列赋予新值。
通过以上步骤,在向表中插入数据时,id列将自动从序列中获取下一个值作为自增长的主键值。
首先,你要有一张表!CREATE TABLE example(ID Number(4) NOT NULL PRIMARY KEY,NAME V ARCHAR(25),PHONE V ARCHAR(10),ADDRESS V ARCHAR(50));如果对于以上的建表语句还有疑问的话,建议您不要继续了!有那么些时间您还不如去看看金庸读读琼瑶!然后,你需要一个自定义的sequenceCREATE SEQUENCE emp_sequenceINCREMENT BY 1 -- 每次加几个START WITH 1 -- 从1开始计数NOMAXV ALUE -- 不设置最大值NOCYCLE -- 一直累加,不循环NOCACHE -- 不建缓冲区以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!)书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:CREATE TRIGGER "触发器名称" BEFOREINSERT ON example FOR EACH ROW WHEN (new.id is null)beginselect emp_sequence.nextval into: new.id from dual;end;打完收工!下面你就试试插入数据吧!INSERT INTO example(Name,phone,address) Values(''Cao'',''56498543'',''Heibei'');=============================================================ORACLE SEQUENCE的简单介绍(自增长字段)- -在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
Oracle数据库如何创建表并设置主键自增
首先我们使用oracle sql developer官方管理工具来新建表并色织主键自增,首先连接数据库想必不用多说。
创建表
在表那个文件夹上右键选择新建表
弹出如下图所示:
输入你想要的表名和列名并设置数据类型主键一定要设置NUMBER类型
设置主键
只要在主键那一行单件一下最前面的小方块就行,产生如何所示的效果即可:
主键的标识就是那个小钥匙。
设置主键自增
下面我们设置主键自增,选中主键所在那一行,找到下面的身份列单击(如图所示):
如下图所示看到类型点击下拉菜单选择列序列:
此时系统自动生成触发器和序列不用做任何修改点击确定那个么一个主键自增的表就已经成功的生成了。
测试
下面我们测试一下数据插入是否成功,这里我们直插入name列不插入主键看看主键是否能够自增。
Select一下发现主键确实自动生成并且自增了,如果不放心可以多加几条测试数据,这里我就不多加描述了。
Oracle主键自动增长的实现SequenceOracle oracle maxid自动生成--ORA-00001: 违反唯一约束条件(NAME.SYS_C005547)产生的原因之一oracle中的int类型不像sqlserver那样可以设置自动增长,一般在程序中我们会用select max(id)来取最大ID,但这样不仅效率低而且在操作比较频繁的程序中还会出现插入相同id的情况。
maxid是得到最大ID 然后当做ID来插入,从得到ID到插入数据是有时间差的(虽然很小很小),在这个时间差内如果有另外一个相同操作,那么得到的maxid就是一样的就会报错。
所以在操作频繁的程序中这种取最大ID的方法是错误的。
另外用sequence取到的值最大是999999999999999999999999999 所以不用担心不够用。
oracle中有sequence 可以自动保存一个值并且带有CURRVAL和NEXTVAL两个值,这个就相当于一个maxid生成器,下面来详细说下sequence的用法:(在PL/SQL中可视化建sequence很简单就不多说了下面说下语句建sequence 和其中参数)先假设有这么一个表:view plaincopy to clipboardprint?1.create table S_Depart (2. DepartId INT not null,3. DepartName NVARCHAR2(40) not null,4. DepartOrder INT default 0,5. constraint PK_S_DEPART primary key (DepartId)6.);在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
1、Create Sequence --创建Sequence你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,CREATE SEQUENCE S_Depart_sqs --因为是要和表绑定的,每个表最好拥有唯一的sequence,所以在起名的时候最好和表名关联INCREMENT BY 1 -- 每次加几个START WITH 1 -- 从1开始计数NOMAXvalue -- 不设置最大值NOCYCLE -- 一直累加,不循环CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE针对S_Depart创建的sequence如下:create sequence S_S_DEPARTminvalue 1maxvalue 999999999999999999999999999start with 1increment by 1nocache;一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVALCURRVAL=返回sequence的当前值NEXTVAL=增加sequence的值,然后返回sequence 值比如:emp_sequence.CURRVALemp_sequence.NEXTVAL可以使用sequence的地方:- 不包含子查询、snapshot、VIEW的SELECT 语句- INSERT语句的子查询中- NSERT语句的valueS中- UPDATE 的SET中可以看如下例子:insert intoS_Depart(departId,Departname,Departorder)values(S_S_Depart.Nextval,'12345',1);SELECT empseq.currval FROM DUAL; --在取最大ID的时候格式:名称.Nextval。
Oracle中Sequence使用在Oracle数据库中,Sequence是一种非常有用的对象。
它是一个递增的数值生成器,可以用于为表中的主键列提供唯一的值,也可以用于生成其他需要唯一值的列。
要使用Sequence,首先需要创建一个Sequence对象。
创建Sequence的语法如下:```CREATE SEQUENCE sequence_name[ INCREMENT BY int_value ][ START WITH int_value ][ MAXVALUE int_value , NOMAXVALUE ][ MINVALUE int_value [ NOMINVALUE ] ][CYCLE,NOCYCLE][ CACHE int_value , NOCACHE ][ORDER,NOORDER]```其中,sequence_name是Sequence的名称,用于在后续操作中引用。
INCREMENT BY指定递增的步长,默认为1、START WITH指定Sequence的起始值,默认为1、MAXVALUE和MINVALUE用于指定Sequence的最大值和最小值。
CYCLE和NOCYCLE用于指定Sequence的循环性,如果设置为CYCLE,当Sequence达到MAXVALUE时会重新回到MINVALUE;如果设置为NOCYCLE,则达到MAXVALUE后会停止递增。
CACHE用于指定Sequence的缓存大小,即一次性预分配多少个Sequence值。
ORDER和NOORDER用于指定Sequence的顺序性,如果设置为ORDER,生成的Sequence值按照创建顺序排列;如果设置为NOORDER,则生成的Sequence值没有顺序。
创建完Sequence之后,可以使用以下语法获取Sequence的下一个值:```SELECT sequence_name.NEXTVAL FROM dual;```其中,sequence_name为之前创建Sequence时指定的名称。