2012-05-23 42 views
80

我有一張現成的表格,因爲我沒有將ID列設置爲表格的標識列來創建表格。如何創建具有標識列的表格

使用SQL Server Management Studio中,我照本宣科一個創建要......現有的表的和得到這個:

CREATE TABLE [dbo].[History](
    [ID] [int] NOT NULL, 
    [RequestID] [int] NOT NULL, 
    [EmployeeID] [varchar](50) NOT NULL, 
    [DateStamp] [datetime] NOT NULL, 
CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

我的問題是,我將如何修改這個SQL,使我得到的表已將ID列設置爲標識

+11

[ID] [int] NOT NULL IDENTITY(1,1) – Li0liQ

回答

114
CREATE TABLE [dbo].[History](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [RequestID] [int] NOT NULL, 
    [EmployeeID] [varchar](50) NOT NULL, 
    [DateStamp] [datetime] NOT NULL, 
CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) ON [PRIMARY] 
+0

我相信這就是我一直在尋找的。我不需要將「PK_History」值更改爲「ID」或任何其他內容? – jp2code

+0

不應該是你所需要的,PK_History只是主鍵約束在列ID上的約束名稱 – Gratzy

+0

參數IDENTITY(1,1) – otc

9
[id] [int] IDENTITY(1,1) NOT NULL, 

當然,因爲您正在SQL Server Management Studio中創建表,您可以使用表設計器來設置標識規範。

enter image description here

+1

恩,謝謝菲爾。我知道該怎麼做,但我不能,因爲桌子已經在那裏了。我必須刪除表格並重新創建它,因此我使用該腳本。 – jp2code

+4

@ jp2code:我的意思是你可以用一個Identity列創建一個測試表,然後編寫腳本來看看它應該如何指定。 – Phil

29

這已經回答了,但我認爲最簡單的語法是:當你真正想改變的選項

CREATE TABLE History (
    ID int primary key IDENTITY(1,1) NOT NULL, 
    . . . 

更復雜的約束指標是非常有用的。順便說一下,我更喜歡命名這樣一列HistoryId,所以它匹配外鍵關係中列的名稱。

+4

OP專門處理輸出現有DDL的GUI工具的輸出目的。該工具可能沒有,「如果可能,使用更簡單的語法」選項。對於OP的特定情況,最小的錯誤可能是編輯生成的DDL中的一行,而不是嘗試使用最簡單的語法從頭開始編寫它。你所給的例子也沒有像OP那樣給PK約束分配一個名字。許多人喜歡命名我的約束,因此它們在所有環境中都具有相同的名稱(dev,test,prod)。 'ID int約束PK_History主鍵標識(1,1)'我相信。 –

+3

也許,也許不是。我一直處於從一個數據庫中取得腳本,在另一個服務器上使用腳本的情況,而在一個地方工作的默認值對另一個地方不是最好的。無論如何,我只是建議這是一個解決方案,因爲它對我來說似乎更簡單(我個人理解「主鍵」關鍵字比我理解約束上的選項要好得多,我考慮使用我不理解的選項「糟糕「)。但是,您爲了解其他解決方案可能更受歡迎的原因提供了很好的觀點我應該補充說,答案已經是公認的答案。 –

-2

唯一鍵允許最大2個NULL值。釋:

create table teppp 
(
id int identity(1,1) primary key, 
name varchar(10)unique, 
addresss varchar(10) 
) 

insert into teppp (name,addresss) values ('','address1') 
insert into teppp (name,addresss) values ('NULL','address2') 
insert into teppp (addresss) values ('address3') 

select * from teppp 
null string , address1 
NULL,address2 
NULL,address3 

如果你嘗試下面插入相同的價值觀:

insert into teppp (name,addresss) values ('','address4') 
insert into teppp (name,addresss) values ('NULL','address5') 
insert into teppp (addresss) values ('address6') 

每一次,你會得到這樣的錯誤:唯一鍵約束的

違反 'UQ__teppp__72E12F1B2E1BDC42'。無法在對象'dbo.teppp'中插入重複鍵。
該聲明已被終止。

+0

我需要使'ID'列**唯一**,而不是'名稱'列。你爲什麼將** unique **約束添加到'Name'列?你在'teppp'表中如何使你受益? – jp2code

+0

這裏完全沒有答案 –

相關問題