SQL Serverテーブルに複数のID列がないのはなぜですか?
CREATE TABLE t(id INT IDENTITY, id2 INT IDENTITY)
メッセージ2744、レベル16、状態2、行5
テーブル 't'に複数のID列が指定されています。
テーブルごとに許可されるID列は1つだけです。
計算列を使用して解決できることを理解しています。
製品ドキュメントによると、1つのテーブルに複数のID列を含めることはできません。しかし、なぜ?その背後にある本当の理由は何ですか?
本当の「内部」の理由はないと思います。メタデータはテーブルレベルではなく列レベルで保存されます。あいまいさがあるため、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;