2010-09-27 89 views
5

「每個表只能有一個IDENTITY列」「每個表只能有一個IDENTITY列」 - 爲什麼?

爲什麼會這樣?以車輛的場景爲例,存在唯一的唯一的註冊號碼以及唯一的註冊號碼。在sql server中描述這種情況我們需要一個自定義的實現爲列的。相反,在Oracle您可以在表格上擁有任意數量的序列。爲什麼對IDENTITY列有任何限制,具體原因是什麼?

擁有車輛模式的場景是想象中的,我在質疑自己爲什麼對身份列有限制。

+1

真的很重要嗎? – 2010-09-27 19:58:50

+0

我想知道爲什麼這是不可能的。 – Chaitanya 2010-09-27 20:01:05

+2

因爲SQL Server團隊的工程師要麼做不到,要麼認爲這不是一個好主意。 – 2010-09-27 20:02:06

回答

8

SQL Server中的標識列具有種子和自動增量。如果我們知道第一個id列的值,我們總能計算出第二個假設的id值應該是多少。

例如如果這是合法的語法

create table #foo 
(
bar int identity(1,10), 
baz int identity(1000,1) 
) 

我們不需要存儲baz,因爲它可以從bar計算如下。

baz = 1000 + (bar-1)/10 
+1

幫你明確我想說的話! – DForck42 2010-09-27 20:08:37

2

數據存儲在數據庫中,以IDENTITY列爲鍵。單個這樣的列允許類似文件系統的存儲。有多個IDENTITY列會混淆這個問題。

我的建議是選擇其中一列爲IDENTITYPRIMARY KEY,另一列爲UNIQUE KEY。作爲用戶不會有任何區別,但它會使數據庫管理員高興。

5

因爲它會是相同的值。如果你有身份(1,1)作爲主,和身份(100,2),你會得到這些結果:

1  100 
2  102 
3  104 
4  106 
5  108 
6  110 
7  112 
8  114 
9  116 
10 118 

,你可以通過這樣獲得的第二列:

(( ID-1)* 2)+100

這是一個線性方程,所以除了show之外還有什麼意思?

+0

我的想法確切。 – ErikE 2010-09-27 21:41:24

+0

但是IDENTITY值並不總是按順序分配。如果您有兩個同時插入多行的值,則這些值可以在兩組行之間交錯。此外,可以插入特定值,以便兩列不相互依賴。只是你可能需要兩個IDENTITY列的幾個原因。 – sqlvogel 2010-09-29 22:13:56

+1

@dportas,當然,但在理論上,如果你有兩個身份,他們都將同時分配,仍然給你相同的效果。 – DForck42 2010-09-30 18:08:27

1
  • Oracle序列不是SQL Server IDENTITY列:您爲它們編寫了一些代碼。他們沒有制定出基於在CREATE TABLE DDL
  • 任何隨後的IDENTITY列可以從第一個制定出的方塊(編輯:其他民間自提)
0

這是一個很愚蠢的限制我同意。儘管解決這個問題並不難。只需創建一個帶有IDENTITY列的單獨表格,以純粹用作序列生成器。插入到序列表中,使用SCOPE_IDENTITY()檢索值,然後將值插入到任意位置。然後您可以根據需要支持儘可能多的序列。

1

原因未在MSDN中解釋,我可以找到。但是,我懷疑它與sql server實現標識列的方式有關。從概念上講,我認爲這更多的是表級的設置或值,而不是列級,而列只是訪問值的一種方式。我認爲這是因爲所有用於與標識值交互的方法都有表格作爲參數,而不是列例如。 IDENT_SEED,IDENT_CURRENT和IDENT_INCR。如果是列級別設置,則參數將包含列名稱。如果桌面上有多個標識列,則這些功能將不起作用。

我只是在猜測。

相關問題