天天看點

oracle 主鍵建立時間,oracle 建立固定長度的自增ID 和 目前時間

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

IS

yyyy     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)

)