Posted on 2007-01-15 12:51
大大毛 閱讀(291)
評論(0) 編輯 收藏 所屬分類:
SQL
???問題:
??????SQL查詢中經常需要借助於表的 primary key 來實現記錄的唯一性標識,但是有的場合中卻不方便對主鍵進行直接處理,例如我遇到的這種情況:
create
?
table
?A(
char
(
500
)?pkCol,col1,col2);
??????表A具有PK列,我現在需要在頁面上Show出以 CheckBox 表示的記錄條,類似於郵件列表的選取。
??????通常的做法會是利用表A的PK列來形成 頁面元素 的ID,這樣在FORM的Submit中就可以拿到選取的記錄PK值,可以很方便的組織SQL來完成整個篩選邏輯。
???????現在的問題是出在這個表A的PK列上,通常表的PK列會利用 Int 類型來建立,這樣建立唯一索引的代價會比較小,用Char來建立PK時的情況也是很多,但是也會保證該列的規則性。可是表A的PK列是建立在一個具有實際含義的Char列上,該列的內容會是用戶手工輸入的結果,可想而知如果用它來構造頁面元素的ID會發生什麼情況:
??????? 1.如果該列寬很大的話,當然就會出錯;
??????? 2.由於該列內容不會是非常“正規”的內容,很有可能包含一些特殊字符,這樣一定會使瀏覽器在解析頁面時產生歧義。
???解決方法:
???????問題2的情況可以通過對表的PK列進行字符替換等手段來排除掉特殊字符,但是問題1的長度過長依舊不能夠解決。
???????我想到的解決該問題的方法是:
??????1.對PK列進行字符替換處理這樣可以被保存在 textarea 這樣的元素裡;
??????2.而需要提交的元素ID則由我以SQL構造的 Identity 列來構造;
??????3.生成頁面的時候只需要建立起提交元素與 textarea 的關聯即可,最終提交的還是PK的值。
??????可能有人會對解決方法3提出疑問,既然可以構造 Identity 列,為啥不直接用它來實現提交呢?
??????看過實現就知道了:
????
Select
????????????MyIDCol
=
(
????????????????
Select
?
Count
(
*
)?
From
?A?subA?
Where
?subA.pkCol
=
A.pkCol?
And
?A.pkCol?
<
?subA.pkCol
????????????),
????????????pkCol,
????????????col1,
????????????col2
????????
From
????????????A
??????這裡可以看 Identity 列(MyIDCol) 是構建在唯一查詢的排序結果集上的,因此它在工作時總能夠保證唯一的區分每一行記錄。
??????但是需要注意的一點就是這條語句形成的 Identity 是關聯到某一時刻的,換句話說,如果在用戶對記錄進行過 Insert/Delete 操作之後,這個Identity的值與做DML之前的記錄是關聯不上的,因此需要在Select時帶出PK列的值,在提交時使用PK值才能保證數據的正確性。
??????當然,改變DB的設計也是可行的,只不過前提是必須在DB的設計階段。