2010-12-28 4 views
2

erstellen Ok, lassen Sie mich das Szenario erklären. Ich habe eine "Bestellungen" -Tabelle mit einer Autoinkr-Taste "orderno" drin. Die Tabelle hat auch ein Feld "Bestelldatum". Was ich will ist eine formatierte Bestellnummer. (orderno_formatted) im folgenden Stil YYYYNUMBER, d. h. Datum der Bestellung plus einer eindeutigen Nummer. und hier ist die Wendung. Wenn kein Auftrag für das Jahr 2010 vor, „orderno_formatted“ sollte 20101 dh Jahr der Ordnung und 1 und dann 20102, 20103 usw.Mysql: wie benutzerdefinierte benutzerdefinierte Tastenkombination basierend auf Jahr und eine eindeutige Nr

nächstes Jahr im Jahr 2011 sollte die (orderno_formatted) wie 20111 wird 20112

Also, was ist der beste Weg, dies zu erreichen. Ich weiß, ich kann nach Max Nr. Suchen. in einer Spalte, aber es kann möglich sein, dass viele Benutzer auf die Website zugreifen, also wenn ein Maximum erhalten und speichern Sie es, während ein anderer Benutzer die gleiche Nummer erhalten kann.

klar?

jede Hilfe wird geschätzt.

Grüße,

Antwort

2

Ich empfehle Ihnen, eine separate Sequenztabelle mit den Feldern und sequence zu erstellen. Sie tun dann:

SELECT sequence FROM year_sequence WHERE year = 2010 FOR UPDATE

Dadurch wird die Tabelle sperrt, so dass alle aufeinander folgenden wählt auf der gleichen Zeile warten für die aktuelle Transaktion eine Transaktion zu beginnen, bevor SELECT läuft ... FOR UPDATE zu begehen (denken Sie daran, wenn Ihr Autocommit ist aktiviert).

Danach erhöhen Sie die Sequenznummer Sie von einem zu lesen, und es zurückzudrängen mit:

UPDATE year_sequence SET sequence = sequence + 1 WHERE year = 2010

Alternativ, wenn die erste Abfrage keine Zeilen gelesen haben, werden Sie eine neue Zeile einzufügen mit Sequenz von 1. Dann committen Sie die Änderungen mit COMMIT.

Jetzt haben Sie eine Sequenznummer, die Sie verwenden können, um in die andere Tabelle einzufügen, die garantiert einzigartig für das Jahr ist und es wird keine Konflikte geben, solange Sie daran denken, diese Methode überall zu verwenden nächste Sequenznummer. Ein anderer Weg wäre, eine Transaktion zu starten, und zuerst ein UPDATE auszuführen, das den Sequenzwert um 1 inkrementiert und in derselben Transaktion nach dem Update den neuen Wert liest und erst danach die Transaktion festschreibt. Dies stellt auch sicher, dass der gelesene Wert immer eindeutig ist, da andere Transaktionen warten, bis Sie den neuen Wert gelesen haben.

0

Wenn Ihre eindeutige Nummer 32bit Länge ist, dann können Sie Jahr Bits zum Beispiel am Ende dieses Wertes, dann haben Sie eindeutigen Wert 48bit Länge.

Verwandte Themen