# [Oracle]創建流水號 ###### tags: `oracle` `trigger` `sequence` `database` `SQL` `Oracle SQL Developer` > [time= 2019 11 06 ] `SQL Developer version: 19.1.0.094.2042` <br> 創表格 Table ```sql= CREATE TABLE TABLE 名稱 ( "ID" NUMBER(10, 0) NOT NULL ENABLE, "DATA" VARCHAR2(22 BYTE) NOT NULL ENABLE, "D_INSERTTIME" NOT NULL ENABLE, ) SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING TABLESPACE "WMS_MAIN"; COMMENT ON COLUMN "WMS"."WMS_OrderStatusReturnLog"."ID" IS '流水號'; COMMENT ON COLUMN "WMS"."WMS_OrderStatusReturnLog"."DATA" IS '資料'; COMMENT ON COLUMN "WMS"."WMS_OrderStatusReturnLog"."D_INSERTTIME" IS '傳出時間'; COMMENT ON TABLE "WMS"."WMS_OrderStatusReturnLog" IS '排程執行結果紀錄明細'; ``` 建立NUMBER欄位時,可以指定該欄位的precision和scale如下 ```sql= column_name NUMBER(precision, scale) ``` * precision: 總位數,最多為38。 * scale: 小數點後的位數。 例如宣告一個欄位名稱為salary,資料型態為NUMBER,有效位數為10位數,小數後2兩位,則語法為... ```sql= salary NUMBER(10, 2) ``` 如果沒給定precision,則會以儲存的值為準,如果沒給定scale,則預設為0 <br><br><br> 創序列 SEQUENCE ```sql= CREATE SEQUENCE SEQUENCE名稱 MINVALUE 1 -- 最小值,若不指定 或者 指定 NOMINVALUE,則最小值預設為 -10的26次方 MAXVALUE 999999999 -- 最大值,若不指定 或者 指定 NOMAXVALUE,則最大值預設為 10的27次方 INCREMENT BY 1 -- 流水號間隔,不指定的話預設為1 START WITH 1 -- 起始值 CACHE 20 -- 表示CACHE的數量,若不指定的話,預設為20,指定為NOCACHE表示不使用快取 NOORDER NOCYCLE -- 表示達最大值或最小值時不重頭開始,若指定CYCLE則會重頭計算 ; ``` <br><br><br> 創觸發程式 將 Table 和 SEQUENCE 關連起來 (產生流水號) ```sql= CREATE OR REPLACE TRIGGER TRIGGER名稱 BEFORE INSERT ON TABLE名稱 FOR EACH ROW BEGIN IF :new.ID IS NULL OR :new.ID = 0 THEN SELECT SEQUENCE名稱.NEXTVAL INTO :new.ID FROM DUAL; END IF; END; ``` 全部完成後就可以去你新建的table,新增資料來看看ID欄位是否有按順序遞增