oracle在创建表时和其他的数据库有点不一样,如SQL SERVER可以在int类型的字段后加上identity(1,1),该字段就会从1开始,按照+1的方式自增,将这个字段设置为主键,有利于我们进行数据的插入操作。MySql中可以使用“auto_increment”即可。但是oracle有点麻烦,需要使用序列和触发器达到目的。
首先我们创建一个会员表。
DROP TABLE "DATABASE"."TEST";
CREATE TABLE "DATABASE"."TEST" (
"ID" NUMBER PRIMARY KEY NOT NULL,
"NAME" VARCHAR2(255 BYTE) NULL ,
"MEMBERSHIP" VARCHAR2(255 BYTE) NOT NULL ,
"SEX" VARCHAR2(255 BYTE) NULL ,
"BIRTHDAY" VARCHAR2(255 BYTE) NULL ,
"PHONE" VARCHAR2(255 BYTE) NULL ,
)
第二,创建会员表自动增长序列
-- 再建一个序列SEQ_TEST
create sequence SEQ_TEST
minvalue 1 --最小值
nomaxvalue --不设置最大值 maxvalue最大值
start with 1 --从1开始计数
increment by 1 --每次加1个
nocycle --一直累加,不循环
nocache; --不建缓冲区
√删除序列语句
DROP sequence SEQ_TEST
其实一旦定义了customer_id_seq序列,就可以访问序列的curval和nextval属性。
curval:返回序列的当前值
nextval:先增加序列的值,然后返回序列值
以下sql语句先创建了customers表,然后插入两条记录,在插入时设定了id和name字段的值,其中id字段的值来自于customer_id_seq(新建的序列号名)序列。最后查询customers表中的id字段。
create table customers(id int primary key not null, name varchar(15));
insert into customers values(customer_id_seq.nextval, 'name1');
insert into customers values(customer_id_seq.nextval, 'name2');
curval:返回序列的当前值
nextval:先增加序列的值,然后返回序列值
以下sql语句先创建了customers表,然后插入两条记录,在插入时设定了id和name字段的值,其中id字段的值来自于customer_id_seq(新建的序列号名)序列。最后查询customers表中的id字段。
create table customers(id int primary key not null, name varchar(15));
insert into customers values(customer_id_seq.nextval, 'name1');
insert into customers values(customer_id_seq.nextval, 'name2');
第三,创建触发器将序列中的值赋给插入会员表的行
CREATE OR REPLACE TRIGGER SEQ_TEST_TG
BEFORE INSERT ON TEST
FOR EACH ROW
WHEN (new.ID is null)
begin
select SEQ_TEST.nextval into :new.ID from dual;
end;
这里的ID 是表中的需要自增长的字段
/* create or replace tirgger insert_employee_autoinc
before insert on employee
for each row
begin
select employ_autoinc.nextval into :new.Id from dual;
end insert_employee_autoinc
*/
最后测试一下我们的成果
INSERT INTO "TEST"(NAME,MEMBERSHIP,SEX,BIRTHDAY,PHONE) VALUES ('陈', 'B073', '男', '1126', '15915554615');
INSERT INTO "TEST"(NAME,MEMBERSHIP,SEX,BIRTHDAY,PHONE) VALUES ('王', 'B071', '女', '0304', '13054115694');
INSERT INTO "TEST"(NAME,MEMBERSHIP,SEX,BIRTHDAY,PHONE) VALUES ('曹', 'B070', '男', '0815', '13813778941');
INSERT INTO "TEST"(NAME,MEMBERSHIP,SEX,BIRTHDAY,PHONE) VALUES ('郑', 'B078', '男', '1019', '13223778965');
INSERT INTO "TEST"(NAME,MEMBERSHIP,SEX,BIRTHDAY,PHONE) VALUES ('唐', 'B078', '女', '1019', '13223778965');
select * from TEST;