2011-11-20 83 views
2

我在主鍵(id,type)中有兩列,id是身份,類型是外鍵。 我想設置id列種子像以下:主鍵(兩列)身份增量

id type 
10000 1 
10001 1 
10000 2 
10001 2 
10002 1 
10002 2 
10000 3 

我可以從代碼(或DML)做到這一點,但納悶的是,可以在DDL或SqlServer的表屬性?

+1

使用觸發器有一些限制嗎?如果不是,您可以使用一個而不是標識列。 –

+0

在單一類型中,您是否允許在序列中存在空白? –

+0

在當前的**版本的SQL Server中確實沒有對此的支持,但對於SQL Server 2012(「Denali」),您將能夠在您的數據庫中創建「SEQUENCE」對象,這對於此 - 他們發出連續的數字,完全與任何其他數據庫對象分開。 –

回答

2

id列爲每行增加1。沒有辦法重複它。爲什麼你不能只有標識符列是表格的PK?你可能不得不求助於使用觸發器來做到這一點。

+0

時,您需要創建一個新的理由:好吧,我與我的團隊討論了這個問題。該組織有幾種發票類型(即將收到的,收到的自有費用,收到的預付款,...... - 依法禁止)。約20年來,每種類型的數字都以相同的數字開頭,我不確定是否改變這一點。 – davor

+3

目前還不清楚您是否有改變表結構的靈活性,但在這種情況下,我總是主張使用代理鍵(如InvoiceId作爲標識列),然後使用另一列作爲自然鍵。在這種情況下,自然鍵可以是InvoiceNo,它可以是您的id +類型字段(例如10001-2,10003-1)的組合。您仍然可以擁有單獨的專欄。如果您以這種方式進行設置,企業是否改變了他們對如何生成發票號碼的想法並不重要。 –

+1

聞起來像一個規範化/數據庫設計問題。應該有一個發票表和發票類型表。雖然發票可以有一個類型列,但它可能不需要是PK的一部分。替代關鍵建議Clint +1。這就是數據倉庫中這些問題的處理方式。爲代理鍵創建一個新的標識列,並在舊的標識和類型列上添加一個唯一約束。 – brian

0

Microsoft SQL Server不允許您通過TSQL非常輕鬆地在現有列上添加或更改標識。要更改原始種子值並重新設置所有現有行,必須刪除標識列並重新創建它,以指定新的種子值。當表中包含數據時,將使用指定的種子和增量值將標識號添加到現有行中。