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