茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671899 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_0056.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2019/7/29 13:36:56

Oracle欄位自動流水號真是不人性化

幹嘛要用流水號
這個問題我之前也有思考過,最初設計用流水號是因為沒有適當欄位可以當key,因此設計一個欄位只單純區分每一個欄位,不過現在的資料庫設計時,因為正規化的設計下,其實一個table真的沒有辦法找出key或組合出key變成比較少見了,所以流水號其實只是偷懶的方式做區分而已。

MySQL的流水號

第一次使用流水號的欄位就是在MySQL資料庫的Schema設計上,由於MySQL設計基礎是簡單易用的資料庫,因此如果要一個欄位自動產生流水號真是非常的簡單,只需要再Create Table的時候補上一個關鍵字就可以搞定了。

這是官方的一個例子,只要欄位後面增加一個AUTO_INCREMENT的keyword,就表示該欄位會自動在新增一筆資料時,欄位數值+1,當然如果希望每次增加量不是1的情況也是可以補參數下去調整的。

CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) );

Oracle的流水號

很不幸的,Oracle的流水號設計就沒有這麼輕鬆了,要把整個流水號的設計分成三個階段去描述:1. 建立Table、2. 建立Sequence、3. 建立Trigger。簡而言之就是利用Trigger於新增資料的時候偷偷將自動遞增的欄位數值補上,而補上的數值則由Sequence去控管,Table本身建立的時候不提供流水號建立。

以一個範例做簡單的介紹,第一個步驟是建立TableCREATE TABLE TEST_AUTO_INCREMENT_TABLE( ID NUMBER,DAT VARCHAR2(200) );

步驟二建立Sequence是利用Oracle內建的Sequence元件來做流水號的管理,當然Sequence不僅僅是拿來做流水號使用,但是我使用上幾乎只用來做這個功能就是了(乾笑)。CREATE SEQUENCE TABLE TEST_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE; 


步驟三是關鍵,將Sequence的流水號與Table之間做關聯,主要設計方式就是,在該Table發生Insert動作之前將SEQ的值填上流水號。CREATE TRIGGER TEST_AUTO_INCREMENT_TABLE_INSERT BEFORE INSERT ON TEST_AUTO_INCREMENT_TABLE FOR EACH ROW BEGIN SELECT TABLE TEST_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL; END;

你會發現MySQL一行搞定的東西,跑到Oracle是分三段語法去整合,雖然說SEQUENCE本身不僅僅是提供流水號效果,而TRIGGER本身也是現在常用的控管方式,但是僅僅是為了流水號的功能就必須額外管理一個SEQUENCE/TRIGGER真是挺不人性化的。

原文出處:被遺忘的瞇瞇: Oracle欄位自動流水號真是不人性化
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|