2013-05-30 53 views
0

Client表:如何設計自動增量字段,同時允許手動用戶輸入?

Id (PK), int, not null (IDENTITY) 
NoClient, int, not null 

形式(線框):

enter image description here

  • 字段NoClient應爲數字
  • 字段NoClient應該是唯一的
  • 的如果爲空,則應該自動生成NoClient字段
  • 領域NoClient僅供參考
  • 場NoClient不是主鍵
  • 場NoClient沒有標識列

如何解決這一問題SQL明智?

編輯。我說的是NoClient列,而不是ID

+0

將另一列添加到您的表格中。數據庫不允許這個原因。 – evanmcdonnal

+2

使其可以爲空,如果它爲空,則添加一個插入觸發器來填充它。 – Blorgbeard

+0

爲什麼你想讓用戶設置PK?他們如何知道該號碼是否已被使用? – Oscar

回答

4

嚴格解釋這些規則,沒有解決方案。其中一條規則要麼不正確,要麼不準確。你不能用AFTER觸發器解決它,因爲你不能嘗試在數字字段中插入一個空格,也不能用BEFORE觸發器。你也不能使用默認值。

現在,如果你的意思是「什麼時候留空」意思是「什麼時候留空」,那麼你可以用一個非常精心製作的BEFORE TRIGGER來解決它。 (或者一個AFTER TRIGGER,如果你可以把這個字段改爲一個空的int)

如果你的意思是「當留空時」意味着你沒有在插入/更新中提到該列,那麼你可能會通過精心設計的默認設置,通過將通過NewID的呼叫轉換爲GUID到一個非常大的數字。作爲一個便箋,我會告訴設計師回去重新設計它,因爲無論您最終提出什麼樣的解決方案,它都不是很具有伸縮性,並且PITA可以正確執行。您必須基本鎖定整個表格(從讀取和寫入),執行整個表格/索引掃描以確保您創建的值爲UNIQUE。您可能應該使用ID字段作爲客戶端號碼,可能會使用不以0開頭的內容進行播種。

+0

我同意。非常。 – maxbeaudoin

+1

我想你可以創建第二個表,它只有一個標識,並且在'before trigger'期間(我假設你可以做到這一點),向它插入一行,檢索最後創建的標識,並將其分配給clientno字段,併爲嘗試插入的每一行執行此操作。可能比專門鎖定客戶端表更好。或者讓設計師將clientno設爲可空字段,然後在「AFTER TRIGGER」中執行,這樣會更好。 –

0

首先執行一個查詢到SET IDENTITY OFF,插入您的ID,然後再次設置IDENTITY ON。

相關問題