2011年6月6日 星期一

Oracle資料庫的ROW_ID欄位

Oracle資料庫
和Microsoft SQL Server資料庫
或IBM DB2資料庫
在資料表上多了一個預設的欄位
叫作ROWID

在TOAD for Oracle的產品中
預設是看不到這個欄位
必須要勾選開啟, 如下圖的紅框標示處所示

















據某本Oracle參考書上說,
這是為了方便管理資料
可是他沒有講實際方便管理的例子

ROWID長得像是這樣
AAA9soAAJAAABc4AAA
每新增一筆資料
就自動獲得一個惟一的ROWID

我在目前維護的程式中
看到有人是將ROWID當作刪除或更新的主鍵
這樣真的還滿方便
它的作法是查詢資料時一併查詢ROWID
然後將ROWID寫進HTML中
送出表單時只要送出ROWID
則Server端就知道要砍哪一筆資料

要不就必須送出該資料的全部主鍵
然後Server端再一個個加以設定
在單筆資料情況下還好, 就直接取表單的值
如果是多筆資料的情況
還多了 一個動作:
判別欲異動的資料是第幾筆
接著在表單參數的陣列中
取出該筆資料的值
例如:
String[] names = request.getParameterValues();
String name = names[欲異動資料的index];

而如果有了ROWID幫忙
在多筆資料情況下
也是只要送出ROWID即可解決問題

由以上例子可以看出
ROWID可以方便資料的存取

但是我會想打這篇文章
是因為有一次為了測試
我砍了Oracle資料庫中的一筆資料
然後同事說不能這樣做
因為它有ROWID
可能會影響到其它資料??

真的會嗎?

於是我去看目前維護的程式中
資料庫裡, 沒有人用ROWID當做外鍵
程式中, 也沒有人把ROWID的值寫死在程式裡
也沒有這樣的SQL句子: SELECT * FROM EXAMPLE_TABLE WHERE ROWID = ?

所以我砍了一筆資料
並不會害資料表的關聯性消失
也不會造成查不到資料的情況
可以安心刪除, 再新增回來
就好像什麼事都沒發生過一樣

總結:
1.ROWID可以方便資料表存取, 即當作UPDATE或DELETE句子的條件
2.ROWID不可以用來當做外鍵, 亦不可寫死在程式中. 因為你總不能期待資料永遠會在同個位置等你, 它可能會被刪除, 然後再新增.
3.ROWID還是可以當作SELECT句子的條件, 只要你是先用其它主鍵查過一遍, 想要再查一次比較詳細的資料時, 因為你懶不想打太多主鍵, 就可以用ROWID. 我以為這不是好的作法, 因為可能你在前一次查詢後, 資料表做了某些異動, 資料還是在, 可是ROWID卻換了一個. 接著第二次查詢就會失敗.

總結後的總結:
1.請把ROWID只拿來當作UPDATE或DELETE句子的條件.
2.不要將ROWID寫死在任何地方, 比如其他資料表, 或者程式裡面. ROWID應該永遠是取用來自SELECT查詢所得的結果.

沒有留言:

張貼留言