2011-05-27 61 views
-1

SQL SERVER,我正在使用一個表使用guid而不是一個整數,但對於我正在進行的整合,我需要它是一個int。所以,我想寫一些將創建一個ID列,如果它不存在,並填充下一個最高的ID。我不確定如何做到這一點。有沒有人有這樣做的代碼?添加一個新的主鍵列

我已經嘗試過這一點,但更新不工作,因爲他們是空

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'c_Product'AND COLUMN_NAME = 'ProductId') 
BEGIN 
ALTER TABLE c_Product ADD ProductId INT 
END 
UPDATE c_Product SET ProductId = (SELECT Max(ProductId) + 1 END FROM c_Product) 
+1

所以,基本上你想把主鍵從'GUID'轉換成自動增加的('IDENTITY')。對? – 2011-05-27 12:37:38

+0

沒錯,但我想在程序執行過程中執行 – user204588 2011-05-27 12:46:01

+1

我們可以重申這一點:「如果INSERT沒有給出值,我想要一個int列自動填充」。還有第二個問題「我可以把它作爲主鍵」嗎?是否有任何要求保留現有的價值?任何暗示的排序?你可以讓新的列成爲IDENTITY嗎?如果你需要幫助,那麼我們需要知道你在問什麼。 – gbn 2011-05-27 12:55:39

回答

3

我在這裏很密集。你不只是想做:

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'c_Product'AND COLUMN_NAME = 'ProductId') 
BEGIN 
    ALTER TABLE c_Product ADD ProductId INT IDENTITY(1,1) not null 
END 

這將爲所有現有的行分配標識值,然後提供新的數字,因爲插入新的行。

+0

太棒了,謝謝你的幫助 – user204588 2011-05-27 14:05:09

0

好了,你添加一個名爲INT類型的ProductID列,它的方式是NULL。 SQL Server以三種狀態之一存儲值。 TRUE,FALSE,NULL。現在記住Null不是空的,它不是零,它不是真的,也不是假的。這是幾乎沒有發生過的事情,也不存在。明白這點?好吧,在'新創建'列中具有這個最高值的行是---- NULL。那麼什麼是MAX(PorductId)?空值。什麼是空值+1?空值。所以,除非你把一個值設置爲1,否則你將永遠陷入永無止境的循環。

回到表設計。使用主鍵的GUID是一個非常糟糕的不行!這會嚴重影響桌子的表現。除非您編寫的應用程序必須連接多個服務器和平臺,否則不要使用GUIDS作爲主鍵。很長的解釋,但基本上所有的插入都是隨機的,然後索引頁面拆分幾乎每個插入都發生,並且搜索速度也更慢,並且僅爲PK列使用每行16個字節,這並不好。然後,將其添加到每個其他數控指標,壞壞壞。如果可以,請更改您的表格結構。使用和int。