在设计数据库表的时候发现oracle没有自增主键的设置,google了解到oracle本身并不支持自增主键,需要通过序列(sequence)和触发器(trigger)实现。
创建表student
create table student( id number(12) primary key, --通过序列和触发器实现id的自增 name varchar2(20) , age number(3) , sex number(1) )
创建序列sequence
create sequence seq_student minvalue 1 maxvalue 99999999999999999999 start with 1 --从1开始 increment by 1 --增量为1 cache 0 order;
创建触发器trigger
create or replace trigger student_autoincrement before insert on student for each row when (new.id is null) begin select seq_student.nextval into :new.id from dual; end;
注意点:
1:一个sequence可以被多个表共享。
2:被多个表共享的sequence生成的数字序列始终连续,不会重新开始。
3:如果不再使用的sequence请删除。
select * from daysbfj.days_card_update3 order by id asc --alter table daysbfj.days_card_update3 add source_flag varchar2(2); --create sequence days_card_update2_seq_id minvalue 1 maxvalue 999999999 start with 1; --update daysbfj.days_card_update2 set id = days_card_update2_seq_id.nextval; --update daysbfj.days_card_update3 set source_flag = '2'
另一个例子:
新建一个缺少主键的表
create table test1(name1 varchar2(40),city varchar2(40));
–插入数据
insert into test1 values('name1','nanjing'); insert into test1 values('name1','nanjing'); insert into test1 values('name2','nanjing1'); insert into test1 values('name3','nanjing2'); insert into test1 values('name4','nanjing3'); insert into test1 values('name5','nanjing4'); insert into test1 values('name6','nanjing5'); insert into test1 values('name7','nanjing6'); insert into test1 values('name8','nanjing7'); insert into test1 values('name9','nanjing8'); insert into test1 values('name10','nanjing9'); insert into test1 values('name10','nanjing9'); insert into test1 values('name12','nanjing11'); insert into test1 values('name13','nanjing12'); insert into test1 values('name14','nanjing13'); commit;
–增加主键id
alter table test1 add id number(10);
–设置sequence使id自增
create sequence seq_id minvalue 1 maxvalue 999999999 start with 1;
–将id的值设置为sequence
update test1 set id=seq_id.nextval; commit;
–设置id为主键
alter table test1 add constraint pk_test1 primary key (id); select id,name1,city from test1;