Warum kann eine SQL Server-Tabelle nicht mehr als eine IDENTITY-Spalte haben?


7

Warum kann eine SQL Server-Tabelle nicht mehr als eine Identitätsspalte haben?

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

Meldung 2744, Ebene 16, Status 2, Zeile 5
Mehrere Identitätsspalten für Tabelle 't' angegeben.
Pro Tabelle ist nur eine Identitätsspalte zulässig.

Ich verstehe, wir können es mit einer berechneten Spalte lösen.

Gemäß der Produktdokumentation darf eine Tabelle nicht mehr als eine Identitätsspalte enthalten. Aber warum? Was ist der wahre Grund dafür?

Antworten:


15

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 $identityes jetzt Mehrdeutigkeiten geben würde.

Wenn der Zweck von darin identitybesteht, 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;

Ergebnisse

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.