Lock Tables

dwex

Erfahrenes Mitglied
Hallo Leute,

mein Quellcode macht zwar keine Fehler - aber ich bin mir nicht ganz sicher ob das gewollte passiert - habe mit Lock Tables noch nie gearbeitet.

Zur Erklärung:
Ich übergebe aus einem Formular Benutzerdaten (also Name, Adresse, Tel, etc.) und speicher das ganze in die MySQL-Tabelle "kunden". Die Tabelle hat einen auto-increment-wert (id) und eine (int) für kundennummer - das nur vorweg ich kann die Kundennummer aus div. Gründen nicht auto-increment machen.

Bevor ich nun den neuen Kunden in die DB eintrage frage ich aus der Tabelle Kunden mit Select die letzte (größte) Kundennummer ab und zähle eins dazu. Dann trage ich die Daten mit der um 1 erhöhten Kundennummer in die Datenbank ein.

Jetzt habe ich mir folgendes gedacht:
PHP:
$sperre = mysql_query("LOCK TABLES `kunden` WRITE")

$abfrage = mysql_query("SELECT * FROM 'kunden' WHERE .......")
if(@mysql_num_rows($abfrage)) {
	$kdnr = mysql_fetch_array($abfrage);
	$kdnr = $kdnr['kdnr'];
	$kdnr++;
} else {
	$kdnr = "";
}

$abfrage = mysql_query("INSERT INTO 'kunden' ......")

$res=mysql_query("select LAST_INSERT_ID()");
$row=mysql_fetch_row($res);
$letzte=$row[0];

$sperre = mysql_query("UNLOCK TABLES");

if($letzte) {
     header("Location: ........");
} else {
     echo "Fehler";
}
Meine Frage dazu - ist das so richtig wie ich das mache?
Vielen Dank für euer Rückinfos!
 
Zuletzt bearbeitet:
Hi!

Also das sieht ziemlich umständlich aus... Und das man in einer MySQL-Tabelle keine zwei auto-increment Werte haben kann, ist altbekannt. Egal, den Lock kannst Du dir auch sparen, genauso wie das zweite Query:
Code:
INSERT INTO
  `kunden`(`kdnr`, `name`, ...)
SELECT
  MAX(`kdnr`)+1
, "dwex"
, ...
FROM
  `kunden`
;
Ok, nicht wirklich hübsch - aber in jedem Fall um einiges performanter. Und mit ein wenig "Syntactic Sugar" oder, noch besser, Stored Procedures wäre auch die Ästhetik wieder da...

Ach ja, hab ich übersehen:
PHP:
mysql_query("select LAST_INSERT_ID()");
ist wirklich nicht gut - vor allem da eine native PHP-Funktion immer besser abschneidet:
PHP:
mysql_insert_id();
Greetz
 
Servus Enumerator,

vielen Dank für deinen Beitrag.
Leider habe ich vergessen zu erwähnen, dass es in der Tabelle 2 Kundennummern gibt. Es sind quasi verschachtelte Kundennummern - die erste KD-Nr. ist für den Hauptkunden und die zweite KD-Nr. ist für den Unterkunden des Kunden.

Ich müsste also die größte KD-Nr. der Unterkunden für den jeweiligen Hauptkunden herausfinden - ich bin mir jetzt nicht ganz sicher (MySQL ist nicht meine Stärke) wie das gehen soll.

Die PHP-Funktion mysql_insert_id() habe ich jetzt schon eingebaut.

Das man keine 2 Auto-Werte machen kann ist mir schon bekannt - ich wollte mit meinem Satz nur der Aussage vorbeugen, nimm doch einfach die ID als Kundennummer ;)
 
'n Abend!

Ich bin mir nicht sicher ob ich Dich richtig verstanden habe.
Aber im wesentlichen würde ich das so probieren:
Code:
INSERT INTO
  `kunden`(`kdnr`,`master`,`name`, ...)
SELECT
  MAX(`kdnr`)+1
, `id`
, $name
, ...
FROM
  `kunden`
WHERE
  `kdnr` = $master
;
... aber ohne Garantie!
Ich hab' mich schon lange von MySQL abgewandt - zugunsten von PostgreSQL -
und nicht wirklich Bock jetzt 'nen Server zum testen aufzusetzen... ;)

Greetz
Enum
 
Zurück