比如表名:tab,主鍵為:id

為望都等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及望都網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站制作、望都網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
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;
以前用的mysql,是有自動(dòng)遞增這個(gè)屬性的,現(xiàn)在用的orlace,需要建序列來實(shí)現(xiàn)遞增,這里記錄一下:
一、先建一張表(PROJECT_LOGS)
二、表建好了,我們來建一下序列,我用的是sqldeveloper界面來建:
其實(shí)到了這里就實(shí)現(xiàn)了遞增,只是寫sql時(shí)要傳入id(SEQ_PROJECT_LOGS.Nextval);
三、創(chuàng)建觸發(fā)器:
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ì)比較混亂,不易管理。
oracle沒有主鍵自增的功能,但是可以通過序列sequence實(shí)現(xiàn)主鍵自增。
建立一個(gè)序列啊,每次從序列中取值,提醒一下插入值的時(shí)候不要插入主鍵,用一個(gè)觸發(fā)器自動(dòng)插入主鍵的值,給你我的一個(gè)案例
CREATE OR REPLACE TRIGGER CRC_028_INOUT_SUMMARY_T(觸發(fā)器名)
BEFORE INSERT ON CRC_028_INOUT_SUMMARY(表名稱)
FOR EACH ROW
DECLARE
L_SUMMARY_ID NUMBER := 0;
BEGIN
-- CRC_028_INOUT_SUMMARY_S 是序列名
SELECT CRC_028_INOUT_SUMMARY_S.NEXTVAL INTO L_SUMMARY_ID FROM DUAL;
:NEW.SUMMARY_ID := L_SUMMARY_ID;
END;
好好看看,可以參考我的博客:
Oracle序列的概念:
序列是一數(shù)據(jù)庫對(duì)象,利用它可生成唯一的整數(shù)。一般使用序列自動(dòng)地生成主碼值(類似于MySQL中的主鍵auto_increment屬性)
有時(shí)候我們定義某張表其中某一列為主鍵,當(dāng)我們往標(biāo)中插入數(shù)據(jù)的時(shí)候,對(duì)于主鍵字段的賦值要求唯一性,我們希望能有個(gè)自增類型的數(shù)據(jù)庫對(duì)象,我們每獲取一次它就自動(dòng)增長,保證下次獲取的時(shí)候肯定是不一樣的值,序列既是這種Oracle對(duì)象。
create sequence sequence_name [increment by n1, start with n2 ,maxvalue n3, cache n , nocache .....]
從序列取值:sequence_name.CURRVAL(取當(dāng)前值) sequence_name.NEXTVAL(取下一條值)
更改序列的定義: alter sequence_name sequence definition;
屬性cache的指定:
如果指定CACHE值,Oracle就可以預(yù)先在內(nèi)存里面放置一些Sequence,這樣存取的快些。
cache里面的取完后,Oracle自動(dòng)再取一組到cache。使用cache或許會(huì)跳號(hào), 比如數(shù)據(jù)庫突然不正常down掉(shutdown abort)
cache中的Sequence就會(huì)丟失。
舉個(gè)例子:比如你的sequence中cache 100,那當(dāng)你sequence取到90時(shí)突然斷電,那么在你重啟數(shù)據(jù)庫后,sequence的值將從101開始。
如果指定NOCACHE值,Oracle就不會(huì)預(yù)先在內(nèi)存里面存放Sequence,當(dāng)然這也就可以避免數(shù)據(jù)庫不正常down掉的sequence丟失。
不過會(huì)產(chǎn)生一些問題:創(chuàng)建nocache sequence在高并發(fā)訪問時(shí),容易導(dǎo)致row cache lock等待事件
主要原因是每次獲取nextval時(shí)都需要修改rowcache中的字典信息。使用nocache sequence,還會(huì)導(dǎo)致如下問題:
由于每次修改字典信息都需要commit,可能導(dǎo)致log file sync等待,nocache sequence在RAC環(huán)境下
會(huì)對(duì)基于sequence生成的列創(chuàng)建的索引造成實(shí)例間大量索引塊爭用。基于以上問題,避免創(chuàng)建nocache sequence。
創(chuàng)建序列的語法,序列是和表一樣的對(duì)象要指定它的用戶
CREATE SEQUENCE sequence
[INCREMENT BY n] -- 自增的公差,默認(rèn)為1
[START WITH n] -- 起始值
[{MAXVALUE n | NOMAXVALUE}] -- 最大值
[{MINVALUE n | NOMINVALUE}] -- 最小值
[{CYCLE | NOCYCLE}] -- 循環(huán)
[{CACHE n | NOCACHE}]; -- 緩存
從序列取值: CURRVAL 取當(dāng)前值, NEXTVAL取下一個(gè)值
更改序列的定義:
ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE NOCYCLE;
一、主鍵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());
本文標(biāo)題:oracle怎么自增主鍵 oracle自增主鍵數(shù)據(jù)類型
URL分享:http://chinadenli.net/article20/higpjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站維護(hù)、網(wǎng)站收錄、虛擬主機(jī)、網(wǎng)站營銷、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)