zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Letzte automatisch eingefügte ID bekommen - MySQL

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 03.08.2009, 15:13
Benutzerbild von Praktikant
Semantikbremse.
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 22.04.2008
Beiträge: 4.985
Praktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz sein
Standard Letzte automatisch eingefügte ID bekommen - MySQL

Hallo Ihr,

ich suche seit einiger Zeit im Internet danach:
Ich brauche für Projekte immer wieder mal die letzte automatisch eingefügte ID (auto_inkrement) der MySQL-Tabelle.
Ich weiß mittlerweile, dass ich dafür die Funktion mysql_insert_id() bei PHP und last_insert_id() bei MySQL nutzen kann, allerdings scheint das nur zu klappen wenn die ID im selben Skript eingefügt (beim gleichen Aufruf) eingefügt wird. Das geschied bei mir aber nicht, da ich die ID ausgeben muss, bevor der Datensatz angelegt wird - quasi als nächste ID die vergeben wird.

Nun habe ich eine "Übergangsfunktion", welche aber die einzige Möglichkeit ist die mir einfällt:
PHP-Code:
            $mysql->query("SELECT id FROM kunden ORDER BY id DESC LIMIT 0, 1;");
            
$row $mysql->fetch_row();
                
$kundenid $row['id'] + 1?> 
Allerdings gefällt mir diese Funktion aus dem Grund nicht, dass es nicht mehr simmt wenn ich den letzten eingefügten Datensatz lösche.

Bsp.: Ich habe 18 Datensätze (letzte automatisch eingefügte ID ist 1.
Ich lösche den letzten Datensatz aus der Tabelle (ID 18 wird gelöscht, letzte ID in der Tabelle ist nun ID 17)
Die Funktion zeigt mir jetzt also ID 18 für de nächsten Datensatz an, eingefügt wird allerdings die ID 19.

Somit wären wir auch schon beim dem Problem. Wenn das meine Kundenverwaltung ist und ich mit dem IDs auch beispielweise offline arbeite stimmt die Zuordnung nicht mehr.

Gibt es hier also eine Funktion, die mir dabei zur Hilfe kommt, oder müsste ich dafür auf auto_increment verzichten? Auf auto_increment würde ich allerdings nur sehr ungern verzichten.

Vielen Dank schon einmal.
__________________
Rettet die Erde.... sie ist der einzige Planet mit Schokolade!
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 03.08.2009, 15:51
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 29.07.2005
Beiträge: 1.073
xm22 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Allerdings gefällt mir diese Funktion aus dem Grund nicht, dass es nicht mehr simmt wenn ich den letzten eingefügten Datensatz lösche.
Was stimmt dann nicht mehr?

Und was heißt, dass Du damit offline arbeiten willst?
__________________
... Meine Meinung

Geändert von xm22 (03.08.2009 um 15:54 Uhr)
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 03.08.2009, 15:52
Benutzerbild von David
auch, ja!
XHTMLforum-Kenner
 
Registriert seit: 08.11.2007
Beiträge: 2.626
David ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer Anblick
Standard

Hab ich dich richtig verstanden? Du brauchst die ID, bevor du die Sachen in die DB einträgst? Du könntest doch einen neuen "Blind"-Datensatz anlegen, nimmst dafür die ID und änderst dann einfach die Einträge für diese ID.
Code:
INSERT INTO Kunde('name') VALUE('John Doe');
Oder du liest einfach den Table-Staus aus:
http://blog.innerlogic.gr/mysql-get-...crement-value/
(Hab ich auch grad nur ergooglet. Keine Ahnung, ob das wirklich so funktioniert.)
__________________
github | http://dnaber.de

Geändert von David (03.08.2009 um 15:56 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 03.08.2009, 16:28
Benutzerbild von Boris
Tanzender Webentwickler
XHTMLforum-Kenner
 
Registriert seit: 29.07.2004
Ort: Kornwestheim / Stuttgart
Beiträge: 4.925
Boris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer Mensch
Standard

Wie wärs mit nem simplen SELECT MAX(id) AS aktuellsteid FROM tabelle ... ^^
Zitat:
Das geschied bei mir aber nicht, da ich die ID ausgeben muss, bevor der Datensatz angelegt wird - quasi als nächste ID die vergeben wird.
Mir entgeht allerdings der Sinn dahinter ... wieso musst du die ID vorher kennen?
__________________
My software never has bugs. It just develops random features ...

» DevShack - die Website des freien Webentwicklers Boris Bojic
Mit Zitat antworten
  #5 (permalink)  
Alt 03.08.2009, 16:37
Benutzerbild von Praktikant
Semantikbremse.
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 22.04.2008
Beiträge: 4.985
Praktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz sein
Standard

Der Kunde will (aus welchem Grund auch immer) zu der Kundennummer Akten anlegen bei der immer die Kundennummer auf dem Index angegeben wird. Dafür braucht er natürlich dann die ID von der Kundenverwaltung und desalb brauche ich die vorher.

Die Lösung von David mit SHOW TABLE STATUS funktioniert. Folgende Syntax führt zum Ergibniss:

PHP-Code:
$mysql->query("SHOW TABLE STATUS FROM datenbank LIKE 'tabelle';"); 
    
$row $mysql->fetch_row(); 
    echo 
$row['Auto_increment']; 
Vielen Dank.

@xm22: Weil ich damit immer die letzte in der Datenbank stehende ID abrufe. Lösche ich aber den letzten Datensatz, so löscht er auch die letzte ID. Diese wird von auto_increment aber nicht nochmal eingefügt, sondern dann "übersprungen"
__________________
Rettet die Erde.... sie ist der einzige Planet mit Schokolade!
Mit Zitat antworten
  #6 (permalink)  
Alt 03.08.2009, 16:53
Benutzerbild von Boris
Tanzender Webentwickler
XHTMLforum-Kenner
 
Registriert seit: 29.07.2004
Ort: Kornwestheim / Stuttgart
Beiträge: 4.925
Boris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer Mensch
Standard

Zitat:
Der Kunde will (aus welchem Grund auch immer) zu der Kundennummer Akten anlegen bei der immer die Kundennummer auf dem Index angegeben wird. Dafür braucht er natürlich dann die ID von der Kundenverwaltung und desalb brauche ich die vorher.
Das klingt eher für mich, als hättest du deine Tabellen in der Datenbank nicht gut durchdacht? Oder musst du auf ein bestehendes System aufbauen?
__________________
My software never has bugs. It just develops random features ...

» DevShack - die Website des freien Webentwicklers Boris Bojic
Mit Zitat antworten
  #7 (permalink)  
Alt 03.08.2009, 16:56
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 29.07.2005
Beiträge: 1.073
xm22 befindet sich auf einem aufstrebenden Ast
Standard

Ich verstehe nicht den Zusammenhang Deiner Kundentabelle und den Akten.

Ich befürchte Folgendes (Kann aber sein, dass ich nur dein Problem nicht durchschaue ):
Jemand will irgendwas mit einer neuen ID anlegen (Die Du jetzt über den Auto_increment-Wert ausliest.) Derjenige fängt also an, da rumzumehren. Jetzt kommt ein anderer, der das gleiche tun will. Dieser Zweite ist aber schneller fertig als der Erste und speichert jetzt seine Daten.

Nun ist der Erste fertig und will seine Daten ebenfalls unter der vorher geholten ID speichern. Das geht aber nicht mehr, weil der Zweite die schon benutzt hat.
__________________
... Meine Meinung
Mit Zitat antworten
  #8 (permalink)  
Alt 03.08.2009, 17:08
Benutzer
neuer user
 
Registriert seit: 13.02.2008
Beiträge: 52
Plasm befindet sich auf einem aufstrebenden Ast
Standard

Edit: da war ich wohl zu langsam

Was machst Du denn, wenn 2 Kunden Parallel (von 2 Mitarbeiten) angelegt werden ?
Also:
Mitarbeiter 1 holt sich aus dem System die nächste freie Kunden-ID (123)
Mitarbeiter 2 holt sich aus dem System die nächste freie Kunden-ID (124)
Mitarbeiter 2 legt nun den Datensatz fest an (123)
Mitarbeiter 1 legt nun den Datensatz fest an (124)

Dann sind die beiden Kunden-ID´s vertauscht.

Wenn Du schon die Auto-Increment-Funktion der DB nutzen willst, dann solltest Du das auch konsequent der DB überlassen. Also: Datensatz anlegen, Insert-ID ermitteln (z.B. mit last_insert_id) und dann die ID an den Akten-Menschen rausgeben damit der die auf dem Index eintragen kann.

Übrigens: die SHOW TABLE STATUS-Funktion ist zwar eine verlässliche Methode um die nächste ID zu ermitteln (was nicht heißt, dass man diese Funktion nutzen sollte), allerdings ist eine gute Technik in Verwaltungssystemen keine Datensätze zu löschen. Man setzt bei einem Datensatz eher ein "Gelöscht-Flag" und belässt die Daten sonst wie sie sind. Das ist zwar aufwendiger, da dieses Flag überall berücksichtigt werden muß, aber dafür gehen keine Daten verloren. Ist z.B. wichtig wenn der Steuerprüfer ins Haus kommt - was sagt der wohl wenn ein paar Zeilen in der DB fehlen ?
Wenn keine Zeilen gelöscht, sondern nur als gelöscht markiert werden, würde auch die Methode "SELECT MAX(id) AS aktuellsteid FROM tabelle" funktionieren - aber eine schönere Technik wird das ganze dadurch trotzdem noch nicht.
Mit Zitat antworten
  #9 (permalink)  
Alt 03.08.2009, 17:20
Benutzerbild von Praktikant
Semantikbremse.
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 22.04.2008
Beiträge: 4.985
Praktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz sein
Standard

Die Datenbank ist neu, es gibt kein bestehendes Konzept. Was meinst du mit du mit "nicht gut durchdacht"? Ich bin für Änderungsvorschläge gerne offen

Datensätze werden nur gelöscht, wenn der Chef sein ok gibt. Davon gibt es normalerweise nur einen und wenn die Datensätze gelöscht werden haben diese dann keine weiteren Informationen, wie z.B. Rechnungen anhängen oder sowas. Das geht nicht.
Rechnungen werden auch in einer anderen Tabelle verwaltet diese werden sowieso nicht gelöscht und sind gesondern (unabhängig von Kunden) abrufbar.

Schön ist die Technik wirklich nicht, ich werde es nocheinmal berdenken, da bin ich aber schon bei, weil ich mir den geäußersten Zweifeln schon bewusst bin. Ich denke ich nehmen soetwas wie "mögliche ID" und nach der Anlegung "tatichliche ID"
__________________
Rettet die Erde.... sie ist der einzige Planet mit Schokolade!
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 03.08.2009, 17:31
Benutzerbild von David
auch, ja!
XHTMLforum-Kenner
 
Registriert seit: 08.11.2007
Beiträge: 2.626
David ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer Anblick
Standard

Dann würde ich es aber so machen, dass du selbst eine ID generierst, diese für die Dauer der Bearbeitung zwischenspeicherst und unter der ID den Datensatz in die DB schreibst und auf Auto-Increment verzichtest.
__________________
github | http://dnaber.de
Mit Zitat antworten
Sponsored Links
Antwort

Stichwörter
letzte eingefügte id, mysql, php


Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MySQL Events automatisch starten Todeshügel Serveradministration und serverseitige Scripte 1 07.11.2010 19:16
Alternativen zur Nutzung von (My)SQL? domsson Serveradministration und serverseitige Scripte 4 06.04.2008 22:06
Ernsthafte Fragen zu MySQL und seiner Indizierung KartoffelKiffer Serveradministration und serverseitige Scripte 2 26.01.2008 00:36
MySQL Query - online ok, lokal kein Ergebnis? Boris Serveradministration und serverseitige Scripte 6 04.09.2007 23:51
MySQL Service deinstallieren NEOX Serveradministration und serverseitige Scripte 1 28.08.2006 19:55


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:46 Uhr.