Ich glaube nicht, dass es einen wirklichen "internen" Grund gibt. Die Metadaten werden auf Spaltenebene und nicht auf Tabellenebene gespeichert. Es müsste jedoch über Skalarfunktionen wie scope_identity()
und Pseudospaltensyntax nachgedacht werden, wie $identity
es jetzt Mehrdeutigkeiten geben würde.
Wenn der Zweck von darin identity
besteht, etwas zu produzieren, das eine Entität eindeutig identifiziert, warum benötigen Sie dann zwei verschiedene willkürlich berechnete Werte, die in dieser Rolle wirken?
Und wo ist der Nutzen überhaupt? Dies ist ein Cross-Site-Dupe, daher werde ich mein Beispiel von SO wiederholen .
Eine Identitätsspalte in SQL Server verfügt über einen Startwert und ein automatisches Inkrement. Wir könnten immer berechnen, wie hoch der 2. hypothetische ID-Wert sein sollte, wenn wir den Wert der ersten ID-Spalte trotzdem kennen.
zB Wenn dies eine legale Syntax war
create table #foo
(
bar int identity(1,10),
baz int identity(1000,1)
)
Wir müssten baz nicht speichern, da es wie folgt aus dem Balken berechnet werden könnte.
baz = 1000 + (bar-1)/10
Seit SQL Server 2012 können Sie sich selbst ausschalten und mithilfe von Sequenzstandards so viele Spalten hinzufügen, wie Sie zu einer Tabelle möchten. Zum Beispiel:
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;