Oracle實(shí)現(xiàn)主鍵字段自增的四種方式
Oracle實(shí)現(xiàn)主鍵自增有4種方式:
- Identity Columns新特性自增(Oracle版本≥12c)
- 創(chuàng)建自增序列,創(chuàng)建表時(shí),給主鍵字段默認(rèn)使用自增序列
- 創(chuàng)建自增序列,使用觸發(fā)器使主鍵自增
- 創(chuàng)建自增序列,插入語(yǔ)句(insert)時(shí),使用自增序列代替值
數(shù)據(jù)庫(kù)表名稱為:userinfo(不能使用user,user為Oracle關(guān)鍵字)
方式一:Identity Columns新特性自增
該種方式要求Oracle版本≥12c
在自增字段后使用以下2種語(yǔ)句的1種:
- generated by default as IDENTITY
- generated always as identity
建表語(yǔ)句:
CREATE TABLE userinfo ( id number(11) generated by default as IDENTITY,--使用自增功能 name varchar2(20) , age number(3) )
測(cè)試:
INSERT INTO USERINFO (name,age) VALUES('張三',18)
結(jié)果:
該種方式很簡(jiǎn)單,底層原理其實(shí)和下面3種方式相似,只是Oracle幫我們省去了多余的操作。
以下是剩余的3種方式,都用共同的特點(diǎn)(先創(chuàng)建自增序列):
準(zhǔn)備工作:
必須先創(chuàng)建自增序列:
--設(shè)置自增序列,名稱為"seq_userinfo",名字任意命名 create sequence seq_userinfo increment by 1 --每次+1 start with 1 --從1開(kāi)始 nomaxvalue --不限最大值 nominvalue --不限最小值 cache 20; --設(shè)置取值緩存數(shù)為20
sequence各個(gè)參數(shù)詳解,可以參考這邊文章:
方式二:創(chuàng)建自增序列,創(chuàng)建表時(shí),給主鍵字段默認(rèn)使用自增序列
建表語(yǔ)句,設(shè)置自增字段默認(rèn)使用自增序列(推薦該方式):
--創(chuàng)建userinfo表 CREATE TABLE userinfo ( id number(11) DEFAULT seq_userinfo.nextval, --"seq_userinfo"為自增序列名稱 name varchar2(20) , age number(3) );
測(cè)試:我使用的是DBeaver軟件:
如圖:
注意:新增了一條數(shù)據(jù),點(diǎn)擊保存,該軟件并不會(huì)立刻自動(dòng)顯示生成的ID,我們需要關(guān)閉當(dāng)前頁(yè)簽,再打開(kāi)就可以看到自增的ID了
如下:
方式三:創(chuàng)建自增序列,使用觸發(fā)器使主鍵自增
建表語(yǔ)句:
--創(chuàng)建userinfo表 CREATE TABLE userinfo ( id number(11) not null, name varchar2(20) , age number(3) );
創(chuàng)建觸發(fā)器(只需要注意注釋的位置):
--創(chuàng)建觸發(fā)器,名稱為"deptinfo_TRIGGER",名字任意命名 create or replace trigger userinfo_TRIGGER before insert on userinfo --"userinfo"為表名稱 for each row begin select seq_userinfo.nextval into :new.id from dual; --1、"seq_userinfo"為自增序列名稱 2、這里的id是你需要自增的序列 end userinfo_TRIGGER; --"userinfo_TRIGGER"為觸發(fā)器名稱
測(cè)試:跟方式1測(cè)試一樣,會(huì)存在不顯示ID問(wèn)題:
如圖:
重新打開(kāi)頁(yè)簽:
如下:
方式四:創(chuàng)建自增序列,插入語(yǔ)句(insert)時(shí),使用自增序列代替值
建表語(yǔ)句:
--創(chuàng)建userinfo表 CREATE TABLE userinfo ( id number(11) not null, name varchar2(20) , age number(3) );
在插入語(yǔ)句中,自增的字段(ID),使用自增序列去代替
如下:
INSERT INTO userinfo(id,name,age) VALUES(seq_userinfo.nextval,'睡竹',18);
注意:方式三與MySQL、微軟的SQL server的自增方式是一樣的!
運(yùn)行結(jié)果:
總結(jié):
對(duì)后臺(tái)系統(tǒng)開(kāi)發(fā)來(lái)說(shuō):
方式1和方式2最方便
方式3還需要新加一個(gè)觸發(fā)器,不推薦
方式4類似于方式2,但是對(duì)Java程序而言,mybatis的xml需要顯式的指定觸發(fā)器,不夠友好
附上刪除觸發(fā)器和自增序列的語(yǔ)句:
--刪除自增序列,"seq_userinfo"為自增序列的名稱 drop sequence seq_userinfo --刪除觸發(fā)器,"userinfo_TRIGGER"為觸發(fā)器名稱 drop trigger userinfo_TRIGGER
到此這篇關(guān)于Oracle實(shí)現(xiàn)主鍵字段自增的四種方式的文章就介紹到這了,更多相關(guān)Oracle主鍵字段自增內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle設(shè)置DB、監(jiān)聽(tīng)和EM開(kāi)機(jī)啟動(dòng)的方法
這篇文章主要介紹了Oracle設(shè)置DB、監(jiān)聽(tīng)和EM開(kāi)機(jī)啟動(dòng)的方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Oracle索引(B*tree與Bitmap)的學(xué)習(xí)總結(jié)
本篇文章是對(duì)Oracle索引(B*tree與Bitmap)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05探討:Oracle數(shù)據(jù)庫(kù)查看一個(gè)進(jìn)程是如何執(zhí)行相關(guān)的實(shí)際SQL語(yǔ)句
本篇文章是對(duì)Oracle數(shù)據(jù)庫(kù)查看一個(gè)進(jìn)程是如何執(zhí)行相關(guān)的實(shí)際SQL語(yǔ)句進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Oracle管道函數(shù)pipelined?function的用法小結(jié)
這篇文章主要介紹了Oracle管道函數(shù)pipelined?function的用法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07PowerDesigner15.1連接oracle11g逆向生成ER圖
這篇文章主要為大家詳細(xì)介紹了PowerDesigner15.1連接oracle11g逆向生成ER圖的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Oracle查詢優(yōu)化日期運(yùn)算實(shí)例詳解
這篇文章主要介紹了Oracle查詢優(yōu)化日期運(yùn)算實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05Oracle備庫(kù)宕機(jī)啟動(dòng)的完美解決方案
這篇文章主要給大家介紹了關(guān)于Oracle備庫(kù)宕機(jī)啟動(dòng)的完美解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Oracle具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05