2013-05-29 54 views
0

我討厭發佈語法相關問題,但說實話,我只是沒有太多經驗來編寫原始SQL語句。如果這是一個簡單的問題,我很抱歉。我有一張有幾百個條目的表格,表格的創建者忘記了將ID列指定爲主鍵,並且忘記設置標識約束。所以,我需要刪除舊的ID列並創建一個新的ID列,並將其設置爲主鍵和標識列。我知道我可以使用SSMS手動修改表,但是我需要編寫一個腳本,我可以將它傳遞給我的客戶端,因爲他們已經在生產該數據庫,並且需要爲多個不同的表進行此更改。該腳本看起來是這樣的:刪除/添加包含主鍵的列 - SQL語法錯誤

ALTER TABLE tblName 
     DROP COLUMN Table_ID 
     ADD Table_ID int PRIMARY KEY IDENTITY(1,1) NOT NULL 

當我執行上面的查詢,我得到以下信息:

Msg 102, Level 15, State 1, Line 3 
    Incorrect syntax near 'Table_ID'. 

誰能告訴我,我缺少的是什麼?

回答

0

我所要做的就是獨立的下降及補充業務分爲兩個ALTER TABLE操作

ALTER TABLE tblName 
     DROP COLUMN Table_ID 

    ALTER TABLE tblName 
     ADD Table_ID int PRIMARY KEY IDENTITY(1,1) NOT NULL 
+0

這很好,但失去了你已經有的值領域。如果你有子表,這是不合適的,因爲你完全吹響了數據的完整性。對這種方法要非常小心。如果您使用生產數據將它發送給客戶,我不會推薦它。價值是如何設定的? – HLGEM

+0

在這種情況下,我正在設計一個可怕的數據庫。主鍵,外鍵或類似的東西沒有添加約束。所有表格都通過名稱字段相互引用。在提出這個問題的時候,我認爲數據庫處於中間階段,ID列的價值不大。但是您的權利......在設計合理的數據庫中,這種說法可能會導致很多問題。 –

+0

我沒有讓你失望,我只是想警告其他人稍後閱讀,這樣做有潛在的問題。 – HLGEM

0

如果id列已經是一個身份,只需修改表以id列上的主鍵

ALTER TABLE TableName 
    ADD PRIMARY KEY (Id) 

,如果不是的話,那麼也做出更改列了。

alter table TableName 
    alter column id int not null Identity(1,1) 
+0

糾正我,錯了,但我不需要設置「身份」屬性以啓用自動遞增功能? –

+0

是的,你的確如此。 –

+0

身份屬性?你的意思是Identity_Insert?或者你的意思是讓列成爲標識列?如果它還不是一個標識列,那麼您需要將其設置爲一個。 (請參閱我編輯的答案。)這與列上是否存在唯一約束或索引完全無關。 –

1

根據語法圖,identity()是column definition的一部分。只有在創建列時,它纔可用作選項。

這意味着這應該能夠創建一個帶有identity()的新的列。

alter table tblName 
add new_column_name integer not null identity(1, 1); 

而這應該使新列成爲主鍵。

alter table tblName 
add constraint new_column_name_pk 
primary key (new_column_name); 

您可能想要在單個事務中執行這兩個語句。你可能不會。

我更喜歡用所有約束添加新列,填充它們,並確認在刪除列之前所有內容都按照預期進行了操作。

+0

提及identity()只能用於列定義 –

0

在現有表創建一個主鍵常量標識字段:如果我

alter table TableName 
add columnName int not null 
primary key identity(1,1)