Sql-Server

為什麼一個 SQL Server 表不能有多個 IDENTITY 列?

  • October 18, 2021

為什麼一個 SQL Server 表不能有多個標識列?

CREATE TABLE t(id INT IDENTITY, id2 INT IDENTITY)

消息 2744,級別 16,狀態 2,第 5 行為

表“t”指定了多個標識列。

每個表只允許一個標識列。

我知道我們可以使用計算列來解決它。

根據產品文件,一個表不能有多個標識列。但為什麼?其背後的真正原因是什麼?

我認為沒有任何真正的“內部”原因。元數據儲存在列級別而不是表級別。它需要重新考慮標量函式(例如scope_identity(),偽列語法),例如$identity現在存在歧義。

從哲學上講,如果目的identity是生成唯一標識實體的東西,為什麼您需要兩個不同的任意計算值充當該角色?

無論如何,好處在哪裡?這是一個跨站點欺騙,所以我將重複我的範例 SO

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

例如,如果這是合法的語法

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

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

baz = 1000 + (bar-1)/10

從 SQL Server 2012 開始,您可以將自己淘汰並使用序列預設值添加盡可能多的列到表中。例如:

CREATE SEQUENCE dbo.Sequence1 
   AS integer 
   START WITH 1 
   INCREMENT BY 1 
   MAXVALUE 1000 
   CYCLE 
   CACHE 50;

CREATE SEQUENCE dbo.Sequence2 
   AS decimal(5,0) 
   START WITH 5
   INCREMENT BY 10
   MAXVALUE 250 
   CYCLE 
   CACHE 50;

CREATE TABLE dbo.T
(
   id integer NOT NULL DEFAULT NEXT VALUE FOR dbo.Sequence1, 
   id2 decimal(5,0) NOT NULL DEFAULT NEXT VALUE FOR dbo.Sequence2, 
);

INSERT dbo.T DEFAULT VALUES;
INSERT dbo.T DEFAULT VALUES;
INSERT dbo.T DEFAULT VALUES;

SELECT * FROM dbo.T;

DROP TABLE dbo.T;

DROP SEQUENCE 
   dbo.Sequence1, 
   dbo.Sequence2;

結果

引用自:https://dba.stackexchange.com/questions/136220