Ich weiß, dass MySQL die Spalten auto_increment auf Primärschlüssel beschränkt. Warum ist das? Mein erster Gedanke ist, dass es sich um eine Leistungsbeschränkung handelt, da es wahrscheinlich irgendwo eine Zählertabelle gibt, die gesperrt werden muss, um diesen Wert zu erhalten.
Warum kann ich nicht mehrere auto_increment-Spalten in derselben Tabelle haben?
Vielen Dank.
mysql
primary-key
auto-increment
Christopher Armstrong
quelle
quelle
Antworten:
Warum sollten Sie eine auto_increment-Spalte haben, die nicht der Primärschlüssel ist?
Wenn Sie möchten, dass eine Spalte automatisch definiert wird, speichern Sie per Definition keine aussagekräftigen Daten in dieser Spalte. Der einzige Fall, in dem das Speichern nicht aussagekräftiger Informationen sinnvoll ist, ist der Sonderfall, dass Sie einen synthetischen Primärschlüssel haben möchten. In diesem Fall ist der Mangel an Informationen ein Vorteil, da kein Risiko besteht, dass jemals jemand in die Zukunft kommt und die Daten ändern möchte, da sich ein Attribut einer Entität geändert hat.
Noch seltsamer erscheint es, mehrere auto_increment-Spalten in derselben Tabelle zu haben. Die beiden Spalten hätten dieselben Daten - sie werden von demselben Algorithmus generiert und schließlich zur selben Zeit ausgefüllt. Ich nehme an, Sie könnten eine Implementierung entwickeln, bei der es möglich ist, dass sie leicht nicht synchron sind, wenn genügend Sitzungen gleichzeitig stattfinden. Aber ich kann mir nicht vorstellen, wie das jemals in einer Anwendung nützlich sein würde.
quelle
Tatsächlich ist das Attribut AUTO_INCREMENT nicht mehr auf den PRIMARY KEY beschränkt. Früher war es in alten Versionen so - definitiv 3.23 und wahrscheinlich 4.0. Das MySQL-Handbuch für alle Versionen seit 4.1 liest sich immer noch so
Sie können also tatsächlich eine AUTO_INCREMENT-Spalte in einer Tabelle haben, die nicht der Primärschlüssel ist. Wenn das Sinn macht, ist das ein anderes Thema.
Ich sollte auch erwähnen, dass eine AUTO_INCREMENT-Spalte immer ein Integer-Typ sein sollte (technisch ist auch ein Gleitkomma-Typ zulässig) und dass sie UNSIGNED sein sollte. Ein SIGNED-Typ verschwendet nicht nur die Hälfte des Schlüsselraums, sondern kann auch zu großen Problemen führen, wenn versehentlich ein negativer Wert eingefügt wird.
Schließlich MySQL 4.1 und höher definiert einen Typ alias SERIEN für BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
quelle
Dies ist eine interessante Frage, da verschiedene Datenbanken einzigartige Ansätze für die Bereitstellung von auto_increment haben.
MySQL : Es wird nur ein auto_increment-Schlüssel generiert, um eine Zeile in einer Tabelle eindeutig zu identifizieren. Es gibt nicht viele Erklärungen dafür, sondern nur die Implementierung. Abhängig vom Datentyp werden die Werte für die automatische Inkrementierung durch die Länge des Datentyps in Byte festgelegt:
PostgreSQL
Der interne Datentyp seriell wird für die automatische Inkrementierung von 1 auf 2.147.483.647 verwendet. Größere Bereiche sind mit bigserial zulässig.
Oracle : Das Schemaobjekt mit dem Namen SEQUENCE kann neue Zahlen erstellen, indem einfach die Funktion nextval aufgerufen wird. PostgreSQL hat auch einen solchen Mechanismus.
Hier ist eine nette URL, die angibt, wie andere DBs sie angeben: http://www.w3schools.com/sql/sql_autoincrement.asp
Wenn Sie nun wirklich mehrere auto_increment-Spalten in einer einzigen Tabelle haben möchten, müssen Sie dies emulieren.
Zwei Gründe, warum Sie dies emulieren müssen:
Wie würdest du es emulieren ???
Verwenden mehrerer Tabellen mit nur einer Spalte auto_increment und Zuordnen zu den gewünschten Spalten in Zieltabellen. Hier ist ein Beispiel:
Kopieren Sie dieses Beispiel und fügen Sie es ein:
Dadurch wird eine Tabelle mit Pop-Quiz für Lehrer erstellt. Ich habe auch fünf Sequenzemulatoren erstellt, einen für jeden Tag der Schulwoche. Jeder Sequenzemulator fügt den Wert 0 in die Spalte val ein. Wenn der Sequenzemulator leer ist, beginnt er mit Wert 0, nächster Wert 1. Wenn nicht, wird die nächste Wert-Spalte inkrementiert. Sie können dann die nextval-Spalte aus dem Sequenzemulator abrufen.
Hier sind die Beispielergebnisse aus dem Beispiel:
Wenn Sie in MySQL wirklich mehrere automatische Inkrementierungswerte benötigen, ist dies die beste Möglichkeit, diese zu emulieren.
Versuche es !!!
UPDATE 2011-06-23 21:05
Ich habe gerade in meinem Beispiel bemerkt, dass ich den @ pop-Wert nicht verwende.
Dieses Mal habe ich 'pop_tue = pop_tue + 1' durch 'pop_tue = @pop' ersetzt und das Beispiel wiederholt:
quelle
bigserial
Datentyp an, der einen Bereich bietet, der viel größer als 2.147.483.647 istWie XL sagt, ist es nicht nur auf Primärschlüssel beschränkt. Es ist eine mögliche Einschränkung, dass Sie nur eine solche Spalte pro Tabelle haben können. Die beste Problemumgehung besteht jedoch darin, so viele Zahlen zu generieren, wie Sie in einer anderen Tabelle benötigen, und diese dann dort einzufügen, wo Sie möchten.
quelle