Geben Sie den automatisch inkrementierten Primärschlüssel zwischen zwei Tabellen frei

8

Hi Ich möchte zwei Tabellen haben, die jeweils eine INT "id" -Spalte haben, die automatisch inkrementiert, aber ich möchte nicht, dass sich beide "id" -Spalten jemals die gleiche Nummer teilen. Wie heißt das und was ist der beste Weg? Sequenz? Iterator? Index? Incrementor?

Motivation: Wir migrieren von einem Schema zum anderen und haben eine Webseite, die beide Tabellen liest und die (int) ID anzeigt, aber ich kann nicht dieselbe ID für beide Tabellen verwenden.

>

Ich verwende SQL Server 9.0.3068.

Danke!

    
user24881 03.10.2008, 15:25
quelle

9 Antworten

14

Konfigurieren Sie einfach das Identitätsinkrement als & gt; 1, z. Tabelle 1 verwendet IDENTITY (1, 10) [1,11,21 ...] und Tabelle 2 verwendet IDENTITY (2, 10) [2,12,22 ...]. Dies gibt Ihnen auch später noch Raum für Erweiterungen.

    
ballpointpeon 03.10.2008, 15:48
quelle
3

Ich denke, eine GUID wäre der einfachste Weg, wenn ich Sie richtig verstehe.

%Vor%     
Galwegian 03.10.2008 15:26
quelle
2

Verwenden Sie eine Spalte mit dem Typ GUID (Globally Unique Identifier). Es ist 16 Byte und wird immer für jede Zeile eindeutig sein.

Beachten Sie, dass Sie im Vergleich zu normalen Integer-Schlüsseln einen deutlichen Leistungseinbruch erhalten.

    
Ilya Kochetov 03.10.2008 15:30
quelle
1

Verwenden Sie eine andere Tabelle mit einem ID-Schlüssel vom Typ int und setzen Sie ihn standardmäßig auf 1, genannt KeyID oder was auch immer.

Lassen Sie eine gespeicherte Prozedur den Wert abrufen, fügen Sie 1 hinzu, aktualisieren Sie dann die KeyID und geben Sie diese dann an die gespeicherte Prozedur zurück, die Ihre zwei Tabellen aktualisiert, die den neuen eindeutigen Schlüssel benötigen.

Dies stellt sicher, dass die ID ein int ist und dass sie zwischen den Tabellen, die die gespeicherte Prozedur verwenden, um neue IDs zu generieren, eindeutig ist.

    
Bravax 03.10.2008 15:38
quelle
1

Sie können eine IDENTITY-Spalte in einer dritten Tabelle definieren, diese verwenden, um ID-Werte zu generieren, aber Sie fügen alle von Ihnen erstellten Einfügungen immer in die Tabelle zurück (damit sie nicht größer wird). Beim Zurücksetzen der Transaktion wird die Tatsache, dass die ID generiert wurde, nicht zurückgesetzt.

Ich bin kein normaler Benutzer von Microsoft SQL Server, also bitte verzeihen Sie irgendwelche Syntaxfehler. Aber etwas wie das Folgende ist, was ich im Sinn habe:

%Vor%     
Bill Karwin 03.10.2008 17:01
quelle
0

Ich weiß nicht, wie Sie es nennen würden.

Wenn Sie keine GUID oder eine separate Tabelle verwenden möchten, könnten Sie auch eine Funktion erstellen, die die Maximalwerte der IDs aus beiden Tabellen betrachtet und eine dem Wert (oder etwas ähnlichem) hinzufügt.

Sie könnten diese Funktion dann in einem Insert-Trigger für beide Tabellen aufrufen.

    
wcm 03.10.2008 15:42
quelle
0

Ich bin persönlich ein Fan der GUID-Lösung, aber hier ist eine praktikable Option.

Viele Lösungen für dieses Problem haben GUID vermieden und eine gute alte Ganzzahl verwendet. Dies ist auch bei Mergereplikationssituationen üblich, bei denen viele Satellitenstandorte mit einem Master zusammengeführt werden und Schlüsselkonflikte vermieden werden müssen.

Wenn GUID für Sie nicht funktioniert und Sie unbedingt int, bigint oder ähnliches haben müssen, können Sie immer nur eine IDENTITY-Spalte verwenden und jede Tabelle hat einen anderen Wert für SEED. Diese Datentypen haben einen sehr großen Bereich, und es ist nicht schwer, den Bereich in nutzbare Segmente aufzuteilen, besonders wenn Sie nur zwei Splits haben wollen. Als Beispiel hat basic int einen Bereich von -2 ^ 31 (-2.147.483.648) bis 2 ^ 31-1 (2.147.483.647). Das ist mehr als genug für eine Kundentabelle, zum Beispiel.

Transact-SQL-Referenz (SQL Server 2000) int, bigint, smallint und tinyint

Beispiel:

%Vor%     
Pittsburgh DBA 03.10.2008 15:50
quelle
0

Wenn Sie dies wirklich mit einem int tun müssen und Sie eine automatisch inkrementierende Zahl haben, so habe ich dies zuvor getan, indem ich die automatische Inkrementierungsfunktion des ID-Feldes in die Sequenz der anderen Tabelle geändert habe. Ich bin nicht sicher in ms sql oder mein sql, aber in pgsql, das bedeutet, dass in der sql Sie dieses Feld haben würde

%Vor%

wobei table_two_sequence die Sequenzfunktion für die andere Tabelle ist. Testen Sie es dann, indem Sie einige Daten einfügen. Es tut mir wirklich leid, wenn das nicht funktioniert in ms sql ich versuche, es tbh zu vermeiden. Andernfalls ist die GUID der beste Weg, wie von anderen erwähnt wurde. Oder wenn Sie in den Code einfügen, den Sie verwenden, könnten Sie einen Algorithmus einfügen, aber es könnte unordentlich werden.

Alternativ können Sie sich überlegen, ob Sie die Daten in einer Tabelle haben möchten, da dies ein Weg wäre. Wenn Sie möchten, können Sie eine Ansicht haben, die zwei Tabellen simuliert. Nur ein Gedanke.

Ich hoffe, ich habe geholfen

    
Daniel Casserly 19.01.2011 10:59
quelle
0

Ab SQL Server 2012 können Sie ein Sequenzobjekt deklarieren Ссылка was genau das ist, was Sie brauchen.

Ich sollte ziemlich trivial sein, um ein Sequenzobjekt mit einer Tabelle zu emulieren enthält den nächsten Sequenzwert und eine gespeicherte Prozedur atomar Wählen Sie den Wert und erhöhen Sie ihn. [Sie hatten gerne Funktionen, aber Funktionen kann keine Nebenwirkungen haben.]

Wie wäre es mit diesem Hack? Erstellen Sie eine Tabelle (MySequence) mit zwei Spalten: Und Identity-Spalte (SequenceValue) und einer Dummy-Spalte (DummyValue) und verwenden Sie diese gespeicherte Prozedur, um einen neuen Sequenzwert zu erhalten. Die einzige Zeile in der Tabelle wird der letzte Sequenzwert sein.

%Vor%

Um die Reihenfolge zu verwenden, müssten Sie die Einfügungen zu den Zieltabellen verwalten - ein Auslöser würde wahrscheinlich funktionieren.

    
Darrel Lee 18.07.2016 00:45
quelle

Tags und Links