2009-07-29 7 views
0

Gibt es andere Strategien für die automatische Inkrementierung eines Primärschlüssels? Also statt der üblichen x + n wo n 1 ist, könnte n eine andere Zahl wie 5 sein? Oder vielleicht eine Zufallszahl, aber so, dass die nächste ID immer noch einzigartig ist?Gibt es andere Strategien für die automatische Inkrementierung eines Primärschlüssels neben dem Standardwert x + 1?

Ich bin nicht sicher, was die Verwendungen sein würden, oder auch wenn es eine gute Idee ist, bin ich nur neugierig.

+1

Eine Zufallszahl wäre nicht sehr gut, da der Primärschlüssel eindeutig sein sollte! –

+0

Technisch gesehen kann "auto-increment" nur x + n sein (wobei n in diesem Zusammenhang normalerweise 1 ist). Vermutlich meinst du Strategien zur Generierung der nächsten ID. – Draemon

+0

@Dreamon, sagte es besser als ich konnte. Ich werde die Frage aktualisieren. Vielen Dank. –

Antwort

2

In T-SQL (MS SQL Server) verwenden Sie die IDENTITY property:

"IDENTITY [(Samen, erhöht)]

Samen Ist Wert, der für die erste in die Tabelle geladene Zeile verwendet wird

Inkrement Der inkrementelle Wert, der dem Identitätswert der vorherigen geladenen Zeile hinzugefügt wird. "

Eine Sache, die Sie wirklich nicht tun sollte, ist zu versuchen und Ihre eigene Rolle, wenn Sie wirklich wissen, was Sie tun und Gleichzeitigkeit umgehen kann usw.

Edit: Warum Sie müssen vorsichtig sein:

Hier einige Pseudo-SQL, die die Gefahr mit Ihrem eigenen Schritt usw. zeigt:

1. @NextID = SELECT MAX(ID) FROM MyTable; 

2. INSERT INTO MyTable(ID + 1, Name) VALUES (@NextID, "Dan"); 

, nun in den meisten Fällen würde dies OK arbeiten. In einer Datenbank mit hohem Volumen besteht jedoch immer die Möglichkeit, dass zwischen den Schritten 1 und 2 eine andere INSERT-Anweisung auftritt. Sie würden dann mit einer Primärschlüsselverletzung und einem Fehler enden. Es passiert vielleicht nicht oft, aber wenn es passiert, wäre es ein Schmerz, genau zu bestimmen.

Der Weg dahin ist, vor Schritt 1 ein LOCK zu haben und es nach Schritt 2 freizugeben. Dies stellt effektiv alle Transaktionen in eine Warteschlange und die Datenbank läuft im "Einzelbenutzer" -Modus. In Systemen mit hohem Volumen kann dies für die Leistung sehr nachteilig sein.

Aus diesem Grund haben alle wichtigen Datenbanken Sequenzen oder integrierte Methoden zum automatischen Inkrementieren von Primärschlüsseln.

+0

Für das Inkrement Argument nehme ich an, es ist eine Funktion außer Frage? ;) –

0

Hängt vom RDBMS ab, das Sie verwenden. In Orakel wäre es dieser (vorausgesetzt, stellen Sie einen Trigger nach oben für den Primärschlüssel) wird:

SQL> create sequence fun_seq 
    start with 8 
    increment by 2; 
1

Im Fall der Master-Master-Replikation in MySQL, ist es wichtig, die verschiedenen Server haben völlig getrennte Auto-Schritte haben um Kollisionen zu vermeiden.

Die Schlüssel werden separat gehalten, indem für jeden Server ein Offset und ein Inkrement angegeben werden. Zum Beispiel

auto_increment_increment= 2 
auto_increment_offset = 2 
1

Wir verwenden auch verschiedene Inkrementschemata für Master/Master-Replikationssituationen. Ich denke, wir haben einen Server, der hochzählt und einen weiteren zählt. Gerade/Ungerade ist auch perfekt gültig.

0

Für zufällige IDs (und solche, die Sie über Server hinweg eindeutig machen können) können Sie GUID-Felder anstelle von int-Feldern verwenden. Diese haben ihre eigenen Probleme und Probleme, und Sie sollten sie gründlich lesen, bevor Sie sich zu solch einem Design verpflichten.

Verwandte Themen