oracle 建立固定長度的自增ID 和 當前時間

2021-06-03 04:47:32 字數 3062 閱讀 5238

view plaincopy to clipboardprint?

01.create sequence test_id 

02.minvalue 1 

03.maxvalue 9999999 

04.start with 1 

05.increment by 1 

06.nocache; 

create sequence test_id

minvalue 1

maxvalue 9999999

start with 1

increment by 1

nocache;

oracle的編號和sql server的不同。sql server可以設定乙個值為自增。

oracle需要先建立乙個sequence,然後用nextval。

例如,若想生成這樣的編碼,0001,0002,0003.。。。。。

首先建立乙個1-9999的整數迴圈序列,

create sequence date_seq

start with 1 --起始值(預設為1可省略)

increment by 1 --可省略(預設為1可省略)

maxvalue 9999 --最大值

cycle --迴圈

nocache --不快取(可避免產生值不連續的情況)

order --保證按次序產生值

有了1-9999的迴圈序列,我們就可以

to_char(date_seq.nextval) 先將其轉換為字元形式。

然後 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或者是其他操作。這也是生產中用於生成帶字元或日期id流水號的標準方法。注意序列中的nocache和order是為了保證序列的連續和次序,如果這方面要求不嚴格,只是為了確保唯一性,可以用cache和noorder獲得好一點的效能。一般來說id只要求保證唯一就可以了。

從數學來說,有固定長度的數字編碼都無法保證唯一性(資料量大了以後都會超越,比如說一共4位,資料量有10000,使用迴圈編碼就肯定有重複)。對於id來說有主鍵約束,對於非id的其他編碼,必須設定unique約束。

然後對於插入的單條資料:

insert into 表名(編號,欄位1,欄位2,欄位3....)

values(to_char(sysdate,'yyyymm')||lpad(to_char(date_seq.nextval),4,'0'),欄位1,欄位2,欄位3...)

對於對乙個整表統一加編號:

create table 編號後的新錶 as

select to_char(sysdate,'yyyymm')||lpad(to_char(date_seq.nextval),4,'0') as 編號,a.* from 編號前的表 a;

oracle沒有date()函式,sysdate函式的值是包括時分秒的,要實現插入當前時間預設值還真麻煩.

只好自己寫儲存過程,而字段預設值裡面又不能呼叫儲存過程,還得寫個觸發器!而儲存過程裡面取出來的sysdate前幾位的只卻變成17-11月 -07的格式了,不是自己想要的,2007-11-17的格式,又得單獨取年月日再組合起來,這樣一來返回值就不能是日期型別而要字元型別了.

乙個字,煩!不過還是把他實現了.下面把**給大家分享一下,如果有更好的方法麻煩告知.

1.儲存過程

create or replace function "get_date" return varchar2

isyyyy     varchar2(36);

mm     varchar2(36);

dd     varchar2(36);

tempdate   varchar2(36);

begin

tempdate := '';

select to_char(to_date(sysdate),'yyyy') into yyyy from dual;

select to_char(to_date(sysdate),'mm') into mm from dual;

select to_char(to_date(sysdate),'dd') into dd from dual;

tempdate := substr(yyyy,1,4)|| '-'||

substr(mm,1,2)|| '-'||

substr(dd,1,2)

;return tempdate;

end;

2.觸發器

create or replace trigger statweek_tg

--statweek fdate 的觸發器

before insert on statweek for each row

begin

select get_date into :new.fdate from dual;

end;

注:這裡的statweek為對應的資料表 fdate為自動增長的字段,get_date為對應的儲存過程名.

3.資料表

-- create table

create table statweek

(星期一   varchar2(20) default 0,

星期二   varchar2(20) default 0,

星期三   varchar2(20) default 0,

星期四   varchar2(20) default 0,

星期五   varchar2(20) default 0,

星期六   varchar2(20) default 0,

星期日   varchar2(20) default 0,

tweek varchar2(10),

admin varchar2(50),

fdate varchar2(20)

)

oracle 固定長度主鍵的生成

開始接觸oracle,覺著非常繁瑣,連主鍵遞增都要做個序列和觸發器,逐漸了解後,覺著這樣的設計還是非常靈活和實用的,下面的 有注釋,應該不用再多解釋了。可以直接用no做主鍵,放棄id這個字段,只是一直使用id,看不到了不舒服,所以就留著了 有乙個小問題就是序列和觸發器的執行需要加上 這個符號,不知道...

oracle 固定長度主鍵的生成

開始接觸oracle,覺著非常繁瑣,連主鍵遞增都要做個序列和觸發器,逐漸了解後,覺著這樣的設計還是非常靈活和實用的,下面的 有注釋,應該不用再多解釋了。可以直接用no做主鍵,放棄id這個字段,只是一直使用id,看不到了不舒服,所以就留著了 有乙個小問題就是序列和觸發器的執行需要加上 這個符號,不知道...

Oracle 建立自增

minvalue 1maxvalue 99999999 start with 1increment by 1nocache order create sequence seqtest increment by 1 每次加幾個 start with 1 從1開始計數 nomaxvalue 不設定最大值...