MS SQL中的幾個問題

2022-03-02 05:58:08 字數 2148 閱讀 2497

1,儲存過程中用到的'n'的意義.

n的作用就是如果你的作業系統是簡體中文,你在n後面的單引號裡輸入了日本、德文、法文什麼的,能保證你的字串是正確的,這時n就要必寫;反之如果n後面的單引號裡只有英文和簡體中文(長度不能超過十幾k),那這個n寫與不寫是一樣的。

上面的解釋和你所看到是同乙個意思,簡單的可以認為是經過了unicode編碼.

2,主鍵的設定問題

第一:編號作主鍵

此方法就是採用實際業務中的唯一欄位的「編號」作為主鍵設計,這在小型的專案中是推薦這樣做的,因為這可以使專案比較簡單化,但在使用中卻可能帶來一些麻煩,比如要進行「編號修改」時,可能要涉及到很多相關聯的其他表,就象黎叔說的「後果很嚴重」;還有就是上面提到的「業務要求允許編號重複時」,我們再那麼先知,都無法知道業務將會修改成什麼?

第二:自動編號主鍵

這種方法也是很多朋友在使用的,就是新建乙個id欄位,自動增長,非常方便也滿足主鍵的原則,優點是:資料庫自動編號,速度快,而且是增量增長,聚集型主鍵按順序存放,對於檢索非常有利;數字型的,占用空間小,易排序,在程式中傳遞也方便;如果通過非系統增加記錄(比如手動錄入,或是用其他工具直接在表裡插入新記錄,或老系統資料匯入)時,非常方便,不用擔心主鍵重複問題。

缺點:其實缺點也就是來自其優點,就是因為自動增長,在手動要插入指定id的記錄時會顯得麻煩,尤其是當系統與其他系統整合時,需要資料匯入時,很難保證原系統的id不發生主鍵衝突(前提是老系統也是數字型的);如果其他系統主鍵不是數字型那就麻煩更大了,會導致修改主鍵資料型別了,這也會導致其他相關表的修改,後果同樣很嚴重;就算其他系統也是數字型的,在匯入時,為了區分新老資料,可能想在老資料主鍵前統一加乙個「o」(old)來表示這是老資料,那麼自動增長的數字型又面臨乙個挑戰。

第三:max加一

由於自動編號存在那些問題,所以有些朋友就採用自己生成,同樣是數字型的,只是把自動增長去掉了,採用在insert時,讀取max值後加一,這種方法可以避免自動編號的問題,但也存在乙個效率問題,如果記錄非常大的話,那麼max()也會影響效率的;更嚴重的是併發性問題,如果同時有兩人讀到相同的max後,加一後插入的id值會重複,這已經是有經驗教訓的了。

第四:自製加一

考慮max加一的效率後,有人採用自製加一,也就是建乙個特別的表,欄位為:表名,當前序列值。這樣在往表中插入值時,先從此表中找到相應表的最大值後加一,進行插入,有人可能發現,也可能會存在併發處理,這個併發處理,我們可以採用loc**程的方式來避免,在生成此值的時,先lock,取到值以後,再unlock出來,這樣不會有兩人同時生成了。這比max加一的速度要快多了。但同樣存在乙個問題:在與其他系統整合時,脫離了系統中的生成方法後,很麻煩保證自製表中的最大值與匯入後的保持一致,而且數字型都存在上面講到的「o」老資料的匯入問題。因此在「自製加一」中可以把主鍵設為字元型的。字元型的自製加一我倒是蠻推薦的,應該字元型主鍵可以應付很多我們意想不到的情況。

第五:guid主鍵

目前乙個比較好的主鍵是採用guid,當然我是推薦主鍵還是字元型的,但值由guid生成,guid是可以自動生成,也可以程式生成,而且鍵值不可能重複,可以解決系統整合問題,幾個系統的guid值導到一起時,也不會發生重複,就算有「o」老資料也可以區分,而且效率很高,在.net裡可以直接使用system.guid.newguid()進行生成,在sql裡也可以使用 newid()生成。優點是:

同 identity 列相比,uniqueidentifier 列可以通過 newid() 函式提前得知新增加的行 id,為應用程式的後續處理提供了很大方便。

便於資料庫移植,其它資料庫中並不一定具有 identity 列,而 guid 列可以作為字元型列轉換到其它資料庫中,同時將應用程式中產生的 guid 值存入資料庫,它不會對原有資料帶來影響。

便於資料庫初始化,如果應用程式要載入一些初始資料, identity 列的處理方式就比較麻煩,而 uniqueidentifier 列則無需任何處理,直接用 t-sql 載入即可。

便於對某些物件或常量進行永久標識,如類的 classid,物件的例項標識,uddi 中的聯絡人、服務介面、tmodel標識定義等。

缺點是:

guid 值較長,不容易記憶和輸入,而且這個值是隨機、無順序的 .

guid 的值有 16 個位元組,與其它那些諸如 4 位元組的整數相比要相對大一些。這意味著如果在資料庫中使用 uniqueidentifier 鍵,可能會帶來兩方面的消極影響:儲存空間增大;索引時間較慢。

參考:

Linux中的幾個問題

明天期末考試,就把往年試卷上的敘述題總結一下 1.如果乙個設定使用者id程式未執行任何改變程序的實際使用者id和有效使用者id的系統呼叫,那麼執行該程式的程序,它的實際使用者id和有效使用者id各是什麼?答 實際使用者id在登入時取自口令檔案中的登入項,如果沒有執行任何改變實際使用者id和有效使用者...

boost log 中的幾個問題

boost 日誌示例中有乙個錯誤 下面這個檔案 應該在開頭加一行 include 否則會出下列錯錯誤 error c2027 使用了未定義型別 boost log v2s mt nt5 expressions aux date time formatter generator traits d li...

幾個問題的

1.寫乙個函式返回引數二進位制中 1 的個數 比如 15 0000 1111 4 個 1 程式原型 int count one bits unsigned int value 解 無符號整型為32位,所以利用迴圈32次,逐個判斷二進位制每一位是不是1 int count one bits unsig...