Sql-Server
為什麼一個 SQL Server 表不能有多個 IDENTITY 列?
為什麼一個 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;