oracle沒有主鍵自增的功能,但是可以通過序列sequence實(shí)現(xiàn)主鍵自增。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供紅花崗企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為紅花崗眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
比如表名:tab,主鍵為:id
1. 增加一個(gè)序列號(hào): create sequence seq_tab
2. 增加一個(gè)觸發(fā)器,如果是insert,則取序列號(hào)值,賦予主鍵列
CREATE OR REPLACE TRIGGER TRI_tab
BEFORE INSERT ON tab FOR EACH ROW
DECLARE
-- LOCAL VARIABLES HERE
BEGIN
IF :NEW.id IS NULL THEN
SELECT SEQ_tab.NEXTVAL INTO :NEW.id FROM DUAL;
END IF;
END TRI_tab;
第一種,通過序列以及觸發(fā)器實(shí)現(xiàn)主鍵自增長。
這種方式適用于直接使用JDBC連接數(shù)據(jù)庫。這種方式將主鍵自增長的任務(wù)完全交給數(shù)據(jù)庫,我們無需在代碼層面上進(jìn)行任何控制。
第二種,通過序列以及Hibernate配置實(shí)現(xiàn)自增長。
這種方式適用于通過Hibernate連接數(shù)據(jù)庫的方式。這種方式在數(shù)據(jù)庫上創(chuàng)建序列,通過配置在POJO類上的注釋,讓Hibernate去調(diào)用數(shù)據(jù)庫的序列實(shí)現(xiàn)自增長。
這兩種方式都是通過Oracle的序列實(shí)現(xiàn)自增長,但第一種通過數(shù)據(jù)庫的觸發(fā)器在插入的時(shí)候自動(dòng)插入主鍵。而后者則由Hibernate自動(dòng)完成獲取主鍵,插入主鍵這一操作。
一、主鍵id自增
oracle 中不能設(shè)置自動(dòng)增加,這個(gè)和其他數(shù)據(jù)庫不一樣,但是有 序列,這個(gè)是Oracle自己特有的東西,
1、首先創(chuàng)建序列:create sequence seq;
語法:
CREATE SEQUENCE 序列名
[INCREMENT BY n] --每次加幾
[START WITH n] --序列從幾開始
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] --小值、大值限制
比CREATE SEQUENCE seq start with 1 increment by 1; --建立了額從1開始每次加1序列
訪問序列時(shí)用 序列名稱.nextval語法
這就創(chuàng)建好了,然后 seq.nextval 就會(huì)返回一個(gè)值,不會(huì)重復(fù)的值,
insert into tablename values(seq.nextval,'test');
insert into tablename values(seq.nextval,'test');
insert into tablename values(seq.nextval,'test');
這樣前3個(gè)id 分別是 1,2,3
二、自動(dòng)生成UUID策略
import java.util.UUID;
Student s = new Student();
s.setId(UUID.randomUUID().toString());
1、關(guān)于主鍵:在建表時(shí)指定primary key字句即可:
create table test(
id number(6) primary key,
name varchar2(30)
);
如果是對(duì)于已經(jīng)建好的表,想增加主鍵約束,則類似語法:
alter table test add constraint pk_id primary key(id);
其中add constraint 和 primary key是關(guān)鍵字,pk_id是主鍵名稱,自定義的額,只要不重復(fù)即可。
2、關(guān)于id自增功能,也很簡單,而且比較靈活。
(1)首先建立一個(gè)序列(就是每次查詢會(huì)自動(dòng)增加值的絕不重復(fù)的對(duì)象,比如每次加1或每次加10)。語法:
CREATE SEQUENCE 序列名
[INCREMENT BY n] --每次加幾
[START WITH n] --序列從幾開始
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] --最小值、最大值的限制
比如CREATE SEQUENCE s_test start with 1 increment by 1; --就是建立了額一個(gè)從1開始每次加1的序列。
訪問序列時(shí),用 序列名稱.nextval的語法。
比如對(duì)于上表,如果想要id字段實(shí)現(xiàn)自增。則在每次插入記錄時(shí),使用下面類似的語法(前提是表和序列已經(jīng)建好)。
insert into test values (s_test.nextval,'張三');
當(dāng)然,你也可以自動(dòng)一些,對(duì)表的插入操作,建立一個(gè)觸發(fā)器,每當(dāng)有數(shù)據(jù)插入時(shí),觸發(fā)器自動(dòng)修改id值為序列的新值,這樣就完全實(shí)現(xiàn)自增id功能了。不過其實(shí)也沒有這個(gè)必要。因?yàn)橛|發(fā)器如果建多了,有時(shí)會(huì)比較混亂,不易管理。
1. 增加一個(gè)序列號(hào)
2. 增加一個(gè)觸發(fā)器,如果是insert,則取序列號(hào)值,賦予主鍵列