2010-09-03 51 views
2

我想知道是否可以創建標識(在Varchar列上創建自動增量,以及如何將其設置爲主鍵並在其他表上創建外鍵引用)varchar列上的標識鍵 - T-SQL

這是代碼,我有 -

CREATE TABLE Questions(
    QuestionID int IDENTITY PRIMARY KEY, 
    QuestionNo as 'Q'+Cast(QuestionID as Varchar(10),  
    Question Varchar(200) 
) 

有沒有一種辦法可以讓QuestionNo作爲主鍵和另一個表中引用它(說答案(AnswerID,QuestionNo,AnswerText)

+6

**這是一個不好的設計,不這樣做!**您可以隨時顯示(應用程序)與「Q」的前綴,但店裏的數值它是一個純粹的int,而FK是int。如果需要,可以將FK分配給兩個列,即int和char(1)類型。沒有必要將其作爲varchar存儲。我與舊代碼爭鬥,它有相同的瘋狂的概念,使一切都成爲黑客,你會最終有代碼,如'如果左(...,1)='Q'...否則,如果左(... ,1)='A'...'或類似的'CASE'語句... – 2010-09-03 19:35:16

+0

是的,我明白你的觀點。謝謝。 – Abey 2010-09-03 19:48:22

+0

@KM:同意。我有一個系統的設置與此類似 - 他們希望這些數字有幾個字母指向記錄編號......它們在開始使用系統時變得更好,並希望更新搜索,以便忽略主要信件* ... – 2010-09-03 19:55:03

回答

8

這個工作對於我在SQL Server 2005上:

CREATE TABLE Questions(
    QuestionID int IDENTITY NOT NULL, 
    QuestionNo as 'Q'+Cast(QuestionID as Varchar(10)) PERSISTED PRIMARY KEY, 
    Question Varchar(200) 
) 

主要的部分是,計算列需要PERSISTED關鍵字...

+0

謝謝你也爲我工作。 :) – Abey 2010-09-03 19:25:01

+0

但是,你會如何在另一個表中將此引用爲外鍵? 我得到的錯誤從這個 CREATE TABLE答案(AnswerID INT IDENTITY PRIMARY KEY,QuestionNo VARCHAR(10),答案爲nvarchar(200),\t \t \t \t \t \t外鍵(QuestionNo)引用問題(QuestionNo)) – Abey 2010-09-03 19:29:33

+0

@Abey :由於'questionno'的長度在'ANSWERS'表中是VARCHAR(10),但是在'QUESTIONS'中是VARCHAR(11),所以出現錯誤 - 一旦這個問題得到解決,它就適用於我。但我同意'gbn' - 我不會爲了速度和未來格式變化的可能性而將'questionno'作爲主鍵。 – 2010-09-03 19:40:38

3
直接

不。

  • 使用上一個整數列計算列(根據OMG小馬回答)
  • 使用UDF(SO1SO2

我的問題是:爲什麼?它會比一個簡單的數字慢。

+0

只是希望身份密鑰更像Q1,Q2 而不是計劃編號 – Abey 2010-09-03 19:31:59

-1

這個代碼工作

CREATE TABLE IdentityExample(
    ID int IDENTITY NOT NULL, 
    QNo as 'Q'+Cast(ID as Varchar(10)) PERSISTED PRIMARY KEY, 
    name Varchar(200) 
)