Oracle数据库中创建自增主键的实例教程
在设计数据库表的时候发现Oracle没有自增主键的设置,Google了解到Oracle本身并不支持自增主键,需要通过序列(Sequence)和触发器(Trigger)实现。
创建表Student
CreateTableStudent( idnumber(12)primarykey,--通过序列和触发器实现id的自增 namevarchar2(20), agenumber(3), sexnumber(1) )
创建序列Sequence
CreateSequenceSEQ_STUDENT minvalue1 maxvalue99999999999999999999 startwith1--从1开始 incrementby1--增量为1 cache0 order;
创建触发器Trigger
CreateorReplaceTriggerSTUDENT_AUTOINCREMENT BeforeInsertonStudent ForEachRow When(NEW.IDISNULL) Begin SelectSEQ_STUDENT.NEXTVALINTO:NEW.IDFROMDUAL; End;
注意点:
1:一个sequence可以被多个表共享。
2:被多个表共享的sequence生成的数字序列始终连续,不会重新开始。
3:如果不再使用的sequence请删除。
SELECT*FROMDAYSBFJ.DAYS_CARD_UPDATE3orderbyidasc --altertableDAYSBFJ.DAYS_CARD_UPDATE3addsource_Flagvarchar2(2); --createsequenceDAYS_CARD_UPDATE2_SEQ_IDminvalue1maxvalue999999999startwith1; --UpdateDAYSBFJ.DAYS_CARD_UPDATE2setid=DAYS_CARD_UPDATE2_SEQ_ID.nextval; --updateDAYSBFJ.DAYS_CARD_UPDATE3setSOURCE_FLAG='2'
另一个例子:
新建一个缺少主键的表
createtabletest1(name1varchar2(40),cityvarchar2(40));
--插入数据
insertintotest1values('name1','nanjing'); insertintotest1values('name1','nanjing'); insertintotest1values('name2','nanjing1'); insertintotest1values('name3','nanjing2'); insertintotest1values('name4','nanjing3'); insertintotest1values('name5','nanjing4'); insertintotest1values('name6','nanjing5'); insertintotest1values('name7','nanjing6'); insertintotest1values('name8','nanjing7'); insertintotest1values('name9','nanjing8'); insertintotest1values('name10','nanjing9'); insertintotest1values('name10','nanjing9'); insertintotest1values('name12','nanjing11'); insertintotest1values('name13','nanjing12'); insertintotest1values('name14','nanjing13'); commit;
--增加主键ID
altertableTEST1addidnumber(10);
--设置sequence使ID自增
createsequenceSEQ_ID minvalue1 maxvalue999999999 startwith1;
--将id的值设置为sequence
Updatetest1setid=seq_id.nextval; commit;
--设置id为主键
altertableTEST1 addconstraintPK_TEST1primarykey(ID); selectID,Name1,CITYfromTEST1;