ORACLE的編號(hào)和SQL SERVER的不同。SQL SERVER可以設(shè)置一個(gè)值為自增。

10年積累的成都網(wǎng)站建設(shè)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有平房免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
ORACLE需要先建立一個(gè)SEQUENCE,然后用NEXTVAL。
一樓的回答可以滿足從2009030001開始自增,但是無(wú)法實(shí)現(xiàn)每月更改。比如說(shuō)數(shù)據(jù)量較小,很可能已經(jīng)5月了,還在2009031999 什么的。
正確的做法是,建立一個(gè)1-9999的整數(shù)循環(huán)序列,然后加上日期值。
CREATE SEQUENCE DATE_SEQ
START WITH 1 --起始值(默認(rèn)為1可省略)
INCREMENT BY 1 --可省略(默認(rèn)為1可省略)
MAXVALUE 9999 --最大值
CYCLE --循環(huán)
NOCACHE --不緩存(可避免產(chǎn)生值不連續(xù)的情況)
ORDER --保證按次序產(chǎn)生值
有了1-9999的循環(huán)序列,我們就可以
TO_CHAR(DATE_SEQ.NEXTVAL)先將其轉(zhuǎn)換為字符形式。
然后
LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),4,'0')對(duì)其進(jìn)行4位加'0'補(bǔ)齊長(zhǎng)度。例如2,補(bǔ)齊為0002。
然后加上插入的日期(只要年月)
TO_CHAR(SYSDATE,'YYYYMM')||LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),4,'0')
然后就可以進(jìn)行INSERT或者是其他操作。這也是生產(chǎn)中用于生成帶字符或日期ID流水號(hào)的標(biāo)準(zhǔn)方法。注意序列中的NOCACHE和ORDER是為了保證序列的連續(xù)和次序,如果這方面要求不嚴(yán)格,只是為了確保唯一性,可以用CACHE和NOORDER獲得好一點(diǎn)的性能。一般來(lái)說(shuō)ID只要求保證唯一就可以了。
從數(shù)學(xué)來(lái)說(shuō),有固定長(zhǎng)度的數(shù)字編碼都無(wú)法保證唯一性(數(shù)據(jù)量大了以后都會(huì)超越,比如說(shuō)一共4位,數(shù)據(jù)量有10000,使用循環(huán)編碼就肯定有重復(fù))。對(duì)于ID來(lái)說(shuō)有主鍵約束,對(duì)于非ID的其他編碼,必須設(shè)置UNIQUE約束。
然后對(duì)于插入的單條數(shù)據(jù):
INSERT INTO 表名(編號(hào),字段1,字段2,字段3....)
VALUES(TO_CHAR(SYSDATE,'YYYYMM')||LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),4,'0'),字段1,字段2,字段3...)
對(duì)于對(duì)一個(gè)整表統(tǒng)一加編號(hào):
CREATE TABLE 編號(hào)后的新表 AS
SELECT TO_CHAR(SYSDATE,'YYYYMM')||LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),4,'0') AS 編號(hào),A.* FROM 編號(hào)前的表 A;
創(chuàng)建一個(gè)最大值為99999的序列就是了:
create?sequence?SEQ_xxxxx
minvalue?1
maxvalue?99999
start?with?1
increment?by?1
select seq_xxxx.nextval from dual;
首先說(shuō),1樓的過(guò)程有點(diǎn)問(wèn)題.可能 loveyurui大大寫的有些急了.少了一個(gè)關(guān)鍵字.create or replace PROCEDURE inc_no(.....;
其次他的返回值,按照LZ的意思,應(yīng)當(dāng)還要+1.時(shí)間格式'yyyymmdd,還缺了一個(gè)引號(hào).
p_num:=to_number(to_char(sysdate,'yyyymmdd')||'00000')+v_num+1;
還有一個(gè),你要求"計(jì)算當(dāng)天已經(jīng)錄入的個(gè)數(shù)"作為新編號(hào)的參考(loveyurui大大此處忽略了),建議在該表上能添加上插入數(shù)據(jù)的時(shí)間,這樣方便提取記錄條數(shù).不然,需要切取編號(hào)的前8位與當(dāng)前時(shí)間YYYYMMDD比較來(lái)提取,效率不高.
v_sql:='select count(*) from '||p_name
||' where substr(編號(hào),0,8)=to_char(sysdate,''yyyymmdd'')';
這樣修改以后應(yīng)該就可以達(dá)到你的要求了.
如果這個(gè)編號(hào)就只用于這個(gè)表的對(duì)應(yīng)的話,最好是用一個(gè)ORACLE的序列對(duì)象(Sequence,可以根據(jù)現(xiàn)在表中已經(jīng)存在的編號(hào)來(lái)確定初始值),通過(guò)與時(shí)間字符串的組合來(lái)生成,這樣比較好.就不用寫存儲(chǔ)過(guò)程了.
create sequence NUM_seq
minvalue 1
maxvalue 999999
start with 1 //此處可以參照你的實(shí)際情況進(jìn)行修改
increment by 1
nocache cycle
往這個(gè)表(假設(shè)為table1)插入數(shù)據(jù)的時(shí)候,就采用
insert into table1(編號(hào),....)
select to_char(sysdate,'yyyymmdd')||LPAD(NUM_seq.nextval,6,'0'),.....
只要所有插入該表的數(shù)據(jù)操作都采用這個(gè)接口語(yǔ)句,ORACLE就自動(dòng)幫你維護(hù)起這個(gè)編號(hào)了.
沒(méi)有實(shí)際調(diào)試,可能還有不足,希望能幫到你.
需要先創(chuàng)建序列,然后nextval添加數(shù)據(jù)使其自動(dòng)生成序號(hào)。
1、創(chuàng)建表:
create?table?test
(id?int,
name?varchar2(20));
2、創(chuàng)建序列:
Create?sequence?seq_test_id
Increment?by?1
Start?with?1
Maxvalue?999999
Minvalue?1
Nocycle
nocache;
3、插入數(shù)據(jù):
insert?into?test?values?(seq_test_id.nextval,'badkano');
4、再插入一條數(shù)據(jù):
insert?into?test?values?(seq_test_id.nextval,'百度知道團(tuán)長(zhǎng)');
這樣可見,序號(hào)是添加成功的。
oracle創(chuàng)建序列基本語(yǔ)法:
CREATE?SEQUENCE?sequence??//創(chuàng)建序列名稱
[INCREMENT?BY?n]??//遞增的序列值是n?如果n是正數(shù)就遞增,如果是負(fù)數(shù)就遞減?默認(rèn)是1
[START?WITH?n]????//開始的值,遞增默認(rèn)是minvalue?遞減是maxvalue
[{MAXVALUE?n?|?NOMAXVALUE}]?//最大值
[{MINVALUE?n?|?NOMINVALUE}]?//最小值
[{CYCLE?|?NOCYCLE}]?//循環(huán)/不循環(huán)
[{CACHE?n?|?NOCACHE}];//分配并存入到內(nèi)存中
網(wǎng)站題目:oracle中編號(hào)如何寫,oracle 自動(dòng)編號(hào)
文章網(wǎng)址:http://www.jbt999.com/article44/dsihche.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站維護(hù)、網(wǎng)頁(yè)設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、做網(wǎng)站、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)