2012-03-20 44 views
2

我們有一個帶有幾百個表的數據庫,這些表具有用於各種資源的CHAR「代碼」字段。此代碼字段是多個表的主鍵和外鍵。將Char PK/FK轉換爲Varchar或RTRIM到處?

我們現在在ASP.NET應用程序的資源的mouseover上顯示此代碼,並且當代碼比CHAR字段長度短時,它將顯示空格。我們通過RTRIMing(通常被忽視)來解決這個問題。

  1. 我們將只有幾個10S活動用戶的低100S因此性能影響應該不會那麼大
  2. 會不會有一種方法,同時從轉換到自動刪除並重新創建所有的PK/FK約束CHAR對VARCHAR?我看了一下INFORMATION_SCHEMA,看起來可行。

回答

1

以我的經驗char導致許多問題,在前端不僅意想不到的空間:

  • 有邏輯錯誤的時候比較不佔後面的空格。
  • 當您詢問len()時:是否返回包含或不包含空格的字符串的長度?
  • char消耗的磁盤空間比必要的多。由於主鍵包含在其表格的每個索引中,因此這可以增加一個不重要的空間量。

因此,從charvarchar重構通常是一個好主意。

根據您擁有的表的數量,這可能是相當多的工作。你首先必須放棄引用列的每個約束。那麼你會:

alter YourTable alter column YourColumn varchar(50) primary key 

之後,你會重新添加約束。您會發現嘗試按照正確的順序添加/刪除約束條件需要很多努力。例如,foreign key需要在引用列上有一個unique約束。所以你必須在unique限制之前刪除foreign key

Right click database -> Tasks -> Generate Scripts會爲您提供很多重新創建約束的語句,如果不是總是按正確的順序。

+0

SQL中的比較很好(忽略空白),但是c#代碼中的比較會導致問題,因爲有時編碼器會將RTRIM值與非RTRIM值進行比較。 – FrancoisCN 2012-03-20 19:47:39

1

根據數值在前端顯示的方式,我不會決定是使用char還是varchar

如果您不得不在所有地方都添加rtrim,您可以在包含此字段的表格周圍創建一個視圖,並在視圖內僅執行一次rtrim

但是,由於聽起來像您的字段不總是5個字符,varchar可能更合適。

不幸的是,沒有自動化的方法來做到這一點。您必須刪除所有主鍵和外鍵約束,更改數據類型,然後重新添加約束。

+0

使其成爲可更新視圖,重命名基表,併爲新的可更新視圖指定舊基表的名稱。 – 2012-03-20 16:50:11

+0

視圖問題有時我們需要實際的邏輯比較鍵,有時我們需要RTRIM的版本來顯示。由於這個原因,我傾向於選擇varchar轉換 – FrancoisCN 2012-03-20 18:49:13