• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Bei SQL Insert Primar Key holen

skizZ

Mitglied
Hallo zusammen,

ich möchte direkt während eines inserts ein weiteres Feld mit dem Wert vom Primary Key, der automatisch gefüllt wird, füllen.

Ich tue mir gerade etwas schwer das Problem zu beschreiben :-)
Hier ein Beispiel...

Tabelle:

id, kundennummer, name, .....

PHP:
mysql_query("insert into benutzer (kundennummer, name) values (X_PRIMARY_KEY, "testian")");
Der Wert X_PRIMARY_KEY soll sich also aus einem beliebigem Präfix, sowie dem Primärschlüssel des Datensatzes zusammensetzen, der nun angelegt wird.

Ich könnte theoretisch abfragen was der Momentane letzte Datensatz ist, und dem Primary Key + 1 setzen. Allerdings könnte, da mehrer Leute neue Benutzer anlegen, in der kurzen Zwischenzeit doch ein neuer Eintrag erfolgen, während ein anderer noch dabei ist, oder? Somit würde das alles nicht mehr stimmen.

Wie komme ich da ran? :-)

Viele Grüße
skizZ
 
Werbung:
Ich weiß ehrlichgesagt nicht, ob es eine Möglichkeit gibt, die zu erzeugende ID innerhalb der INSERT-Query zu verwenden. Aber was du machen kannst:

PHP:
$insertId = mysql_insert_id();
$kundennummer = 'abc' . $insertId;

mysql_query("UPDATE benutzer SET kundennummer = '" . mysql_real_escape_string($kundennummer) . "' WHERE id = " . $insertId);

Das ist „sicher“, da mysql_insert_id() die letzte automatisch generierte ID dieser Verbindung liefert.
 
Moin,

danke schonmal.
Mit "dieser Verbindung" meinst du die Verbindung die von dem Momentanen Benutzer aufgebaut ist? Es kann hierbei also unmöglich zu Verwechselungen kommen?
 
Werbung:
Warum wird der Präfix nicht einfach in ein weiteres Feld gelegt, während es zur Datensicherheit nochmals ein UNIQUE über dem Feld und dem Feld für den PR liegt? Beim Auslesen und Einlesen der Daten wird dieser Wert transparent zusammengefügt/getrennt (zentral in einem Model z.B.).
 
Hallo,

klar, das wäre auch eine Idee. Allerdings wann sollte ich das Feld unique füllen?
Es wäre halt schöner, wenn ich den zweiten PrimaryKey (also Kundennummer) hier nicht aus zwei Spalten zusammensetzen müsste. Ich habe nun direkt nach dem Insert ein Update eingebaut und das funktioniert so einwandfrei und werde es nun auch so belassen.

Die von mermsmaus beschrieben Methode ist also auch sicher, wenn mehrere Verbindungen gleichzeitig zur Datenbank aufgebaut sind, ja?

Wichtig ist ja nur, dass keine Kundennummer doppelt generiert werden kann.

Danke für die Hilfe
 
Zuletzt bearbeitet:
Ja, das ist „transaktionssicher“.

The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.

- MySQL :: MySQL 5.1 Reference Manual :: 11.14 Information Functions
 
Werbung:
Zurück
Oben