Einmalige Nummer?

smisonline2

Mitglied
MySQL Einmalige Nummer?

MYSQL

Hallo, ich möchte in einer tabelle mehrfach einmalige Nummern speichern.

Also z.B. Pro Kunde

Es gibt z.B. 3 Kunden und ich benötige für die Rechnungsstellung pro Kudne die fortlaufenden Nummern

Kunde A:1,2,3,4,5,6,....
Kunde B:1,2,3,4,5,6,....
Kunde C:1,2,3,4,5,6,....

Ich dachte erst , das ich das sicher mit einem Lock auf die Tabelle hinkriege, aber irgendwie komme ich da nicht weietr. Es muss ja verhindert werden, das parrallel das auslesen der nächsten Nummer mit

SELECT
MAX(rechnungsnummer) + 1
FROM
rechnungen
WHERE
Kundennummer = xyz

Insert ....

Wenn ich nun ein Read lock setzen, kann ich nicht schreiben. Wenn ich ein Write lock setze, kann ja jemand anderer lesen.

Wie krieg ich das hin, das ich meine einmalige Nummer pro Kudne hinbekomme?
 
Zuletzt bearbeitet:
Hallo,

das ist nicht Dein ernst? AutoIncrement erhöht 1 Nummer, Ich brauche Mehrfach einmalige Nummern pro Kunde in einer Tabelle
 
Dann setze doch auf mehrere Felder ein auto_increment?
Aus deinem Post wird leider nicht so richtig (für mich) deutlich, was du genau machen willst.
Tabelle Kunden:
kunden_id (auto_inc)
kunde_name

Tabelle rechnungen:
rechnungs_id (auto_inc)
kunden_id

Da hast du jetzt eindeutige Zuweisungen für Kunden IDs und für Rechnungen.
 
Die Tabelle sieht so aus
-KUNDENNUMMER
-RECHNUNGSNUMMER
.....

Jetzt möchte ich pro Kunde einne Rechnungskreis haben. Wenn ich tausende Kunden habe, ist es aber total unrealistisch, tausend RECHNUNGSNUMMER Felder einzufügen

Also es gibt

Kunde A
der Rechnungsnummern haben soll 1,2,3,4,5,6...

Kunde B
der Rechnungsnummern haben soll 1,2,3,4,5,6...

Kunde C
der Rechnungsnummern haben soll 1,2,3,4,5,6...

u.s.w.

Es kann theoretisch unendlich viele Kunden geben

Ach ja, zur Erklärung. Das sind Kunden die unsere Software benutzen. Unsere Software läuft auf einem zentralen Server und diese Kunden stellen anderen Kunden Rechnungen.
 
Ich glaube du brauchst kein Lock. Die Operation geht in der Regel so schnell, dass da nichts passieren sollte, wenn du deinen Code von oben verwendest. Um sicher zu gehen, kannst du dem Feld noch einen Unique index über die KundenID und die RechnungsID setzen. Im Scriptcode einfach abfragen, ob der Query erfolgreich war. Wenn nicht, solange wiederholen (sollte im Regelfall nicht, bzw allerhöchstens einmal).
 
Danke, aber das wird auch nicht funktionieren, da diese Nummer auch 0 sein darf und das so oft wie man will.

Ok, eine Zusatzinfo hat gefehlt.

Es ist nicht die "Hauptrechnungsnummer", sondern eine Unternummer, die nur gebraucht wird, wenn die Rechnung einen bestimmten Typ hat:)

EIne Idee?
 
Upps, da sieht man mal wieder dass ich zu wenig geschlafen habe. Schreibe es einfach in einen Query.
SQL:
INSERT INTO deine_tabelle SET r_nummer = (SELECT MAX(r_nummer)+1 FROM deine_tabelle WHERE k_nummer = "xyz")
Ungetestet.
 
Danke,

allerdings krieg ich jetzt ne Fehelrmeldung:

You cant specify target table rechnung for update in from clause

heir mal wie ich das ganze aktuell in php gneneriere
PHP:
				if($_REQUEST["rechnungsart"] == "Sofortkaufrechnung") {
					//$class = new sofortkaufnummernkreis();
					//$class->setCLIENTID(CLIENTID);
					//$sofortkaufnummer = $class->getNextNumber();
					$subset .= "sofortkaufnummer	= (SELECT (MAX(sofortkaufnummer)+1) FROM ".MODUL_RECHNUNGEN."  WHERE CLIENTID = '.CLIENTID.'),";
					$subset .= "vorkassenummer		= 0,";
					}
				elseif($_REQUEST["rechnungsart"] == "Vorkasserechnung") {
					//$class = new vorkassenummernkreis();
					//$class->setCLIENTID(CLIENTID);
					//$vorkassenummer = $class->getNextNumber();
					$subset .= "sofortkaufnummer	= 0,";
					$subset .= "vorkassenummer		= (SELECT (MAX(vorkassenummer)+1) FROM ".MODUL_RECHNUNGEN."  WHERE CLIENTID = '.CLIENTID.'),";
					}	
				else {
					$subset .= "sofortkaufnummer	= 0,";
					$subset .= "vorkassenummer		= 0,";
					}
 
So, jetzt hab ich's mal getestet:
SQL:
INSERT INTO tutorials_de( k_nummer, r_nummer ) 
SELECT k_nummer, MAX( r_nummer ) +1 AS r_nummer
FROM tutorials_de
WHERE k_nummer =1
 
Zurück