web-dev-qa-db-ja.com

SQL Serverテーブルに複数のIDENTITY列がないのはなぜですか?

SQL Serverテーブルに複数のID列がないのはなぜですか?

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

メッセージ2744、レベル16、状態2、行5
テーブル 't'に複数のID列が指定されています。
テーブルごとに許可されるID列は1つだけです。

計算列を使用して解決できることを理解しています。

製品ドキュメントによると、1つのテーブルに複数のID列を含めることはできません。しかし、なぜ?その背後にある本当の理由は何ですか?

7
user1716729

本当の「内部」の理由はないと思います。メタデータはテーブルレベルではなく列レベルで保存されます。あいまいさがあるため、scope_identity()などのスカラー関数と$identityなどの疑似列構文を再考する必要があります。

哲学的にidentityの目的がエンティティを一意に識別するものを生成することである場合、その役割で動作する2つの異なる任意の計算値が必要なのはなぜですか?

とにかくメリットはどこですか?これはクロスサイトデュープです SOからの例を繰り返します

SQL ServerのID列には、シードと自動インクリメントがあります。とにかく最初のid列の値がわかっていれば、2番目の架空のid値を常に計算できます。

例えばこれが正当な構文である場合

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

次のようにbarから計算できるため、bazを格納する必要はありません。

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;

Results

15
Martin Smith