2013-06-15 9 views
5

In MySQL, wenn Sie eine MyISAM-Tabelle, die in etwa so aussieht:Emulate MyISAM Composite Primärschlüssel mit einem Autoinkrement-Verhalten in InnoDB

CREATE TABLE `table1` (
`col1` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
`col2` INT(10) UNSIGNED NOT NULL, 
PRIMARY KEY (`col2`, `col1`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=MyISAM; 

wenn Sie Zeilen dann die autoincrement Basis einfügen wird für jede unterschiedliche col2 eindeutig sein Wert. Wenn meine Erklärung nicht klar genug ist, sollte this Antwort besser erklären. InnoDB folgt diesem Verhalten jedoch nicht. In der Tat wird InnoDB Sie sogar nicht erlauben, col2 als erstes in der Primärschlüsseldefinition zu setzen.

Meine Frage ist, ist es möglich, dieses Verhalten in InnoDB irgendwie ohne Rückgriff auf Methoden wie MAX (ID) +1 oder dergleichen zu modellieren? Der nächste, den ich finden konnte, ist this, aber es ist für PostgreSQL.

edit: misspelling in Titel

+0

Für diejenigen, die, wie ich, dieses Feature nicht kennen, [die Formulierung im Handbuch] (http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html) kann expliziter sein: "Für MyISAM-Tabellen können Sie' AUTO_INCREMENT' für eine sekundäre Spalte in einem mehrspaltigen Index angeben. In diesem Fall wird der generierte Wert für die 'AUTO_INCREMENT'-Spalte als' MAX (auto_increment_column) + 1 berechnet WHERE Präfix = gegebenes Präfix – RandomSeed

+0

AS für die Lösung sehe ich keine andere Option, als einen Trigger auf Ihrer Tabelle zu erzeugen, wie in dem von Ihnen erwähnten Post vorgeschlagen Die Syntax für Trigger in [MySQL ist nicht so verschieden] (http: //dev.mysql.com/doc/refman/5.6/de/create-trigger.html). – RandomSeed

Antwort

1

Es ist ein nettes Feature von MyISAM, die ich verwendet haben, aber Sie können es mit InnoDB nicht tun. InnoDB ermittelt beim Start die höchste Nummer, behält die Nummer im RAM und erhöht sie bei Bedarf.

Da InnoDB gleichzeitige Einfügungen/Aktualisierungen verarbeitet, muss es die Nummer zu Beginn einer Transaktion reservieren. Bei einem Transaktions-Rollback wird die Nummer immer noch "verwendet", aber nicht gespeichert. Ihre MAX (ID) -Lösung könnte Sie dadurch in Schwierigkeiten bringen. Eine Transaktion beginnt, die Nummer ist reserviert, Sie ziehen die höchste "gespeicherte" Zahl + 1 in einer separaten Transaktion, die der für die erste Transaktion reservierten entspricht. Die Transaktion wird beendet und die reservierte Nummer wird jetzt gespeichert und steht in Konflikt mit Ihrer.

MAX (ID) gibt die höchste gespeicherte Nummer zurück, nicht die höchste verwendete Nummer. Sie könnten eine MyISAM-Tabelle haben, deren einziger Zweck darin besteht, die gewünschten Zahlen zu generieren. Es ist die gleiche Anzahl von Abfragen wie Sie MAX (ID) -Lösung, es ist nur das eine SELECT, das andere ein INSERT.