Hallo,
ich würde gerne die nächste Autoincrement-ID eines MySQL-Insert-Statements wissen bevor das Insert ausgeführt wird. Mit mysql_insert_id() bekomme ich die ID wenn das Insert bereits ausgeführt wurde. Ich möchte die ID aber vorher wissen.
Hallo,
http://dev.mysql.com/doc/refman/5.1/de/show-table-st…
gibt auch aus welche das nächste auto increment ist.
Achte jedoch darauf das das nicht zwangsläufig der eintrag in der Datenbank ist, da in der zeit zwischen ausgabe und eintragen der neuen daten auch schon ein anderer seitenaufruf / prozess diese id gezogen haben könnte.
Gruß
$sql\_adr=mysql\_query("SHOW TABLE STATUS FROM LIKE ''") or die(mysql\_error());
$showtable=mysql\_fetch\_array($sql\_adr);
$autos=$showtable['Auto\_increment'];
Bleibt aber nicht lange erhalten, entweder vorher tabelle sperren
und dann auslesen und entsperren (fals nicht geschrieben) , oder damit leben das irgentein anderer insert den wert verändert hat bevor du dein insert ausführst.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hi soso,
ich würde gerne die nächste Autoincrement-ID eines
MySQL-Insert-Statements wissen bevor das Insert ausgeführt
wird. Mit mysql_insert_id() bekomme ich die ID wenn das Insert
bereits ausgeführt wurde. Ich möchte die ID aber vorher
wissen.
Und du führst nachher den Insert aus mit dieser ID? Dann musst Du verhindern, dass diese ID durch konkurrierenden Zugriff von einer zweiten Instanz weggeschnappt wird, bis Du Deinen Insert machst. Bei Multiuser-Systemen wäre es eine bessere Idee, das Datenbanksystem die IDs vergeben zu lassen. Das ist das einzig wirklich sichere, ohne mit Locks auf Kosten der Performance zu arbeiten, oder überflüssige Sekundärsysteme zur ID-Vergabe zu verwenden.
Ich finde, Du solltest die Architektur des Programms überdenken, wenn es ein Multiuser-System werden soll - nach dem Grundsatz „bevor die Daten in der DB sind, ist die ID unbekannt“. Bei Single-User Systemen tut es auch ein einfacher IFNULL(MAX(id)+1, 1)-Select vor dem Insert und Du kannst Autoincrement aussparen.
Bye
Rudy
ich würde gerne die nächste Autoincrement-ID eines
MySQL-Insert-Statements wissen bevor das Insert ausgeführt
wird.
wie die anderen schon angemerkt haben, könnte das eine
schlechte idee sein. meine frage an dich wäre:
warum? wofür brauchst du das?
Ich danke euch allen!
Ich brauche die ID nur als Vorbesetzung für ein Formularfeld. Für das Insert nehme ich dann das Autoincrement. Wenn dann in 0.1% aller Fälle die ID nicht mit der Vorbesetzung übereinstimmt macht das nichts.
Ich brauche die ID nur als Vorbesetzung für ein Formularfeld.
Für das Insert nehme ich dann das Autoincrement. Wenn dann in
0.1% aller Fälle die ID nicht mit der Vorbesetzung
übereinstimmt macht das nichts.
das klingt trotzdem nicht gut. was ist das für ein formularfeld
und wofür nutzt du es? und je nachdem, wieviele neue datensätze
du bekommst, werden das nicht nur 0.1% sein.
ich frage nur, weil ich in meiner zeit als programmiererin
schon einige sicherheitslücken gesehen habe und ich im schlimmsten
fall dann diejenige war, die den code so übernehmen musste.
wenn du geheimhalten willst, wofür das feld ist, nennt man das
security by obscurity, was in den meisten fällen nicht empfehlenswert
ist.
da schless ich mich an ^^^^
und frag gleich noch ob dann X-Formulare mit der selben NextToInsert ID ausgeliefert werden . Wenns sinn macht ok, bin da neugierig auf deine antwort . Danke
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Das Formularfeld ist deaktiviert und zeigt die ID lediglich an. Ich will das Feld bei Neueinträgen nicht leer (NULL) lassen da der Benutzer sonst glaubt das er dort was ausfüllen muss. Ich will auch nicht einfach irgendwas als Vorgabe verwenden da der Benutzer sonst verwirrt ist wenn nach dem Eintrag was Anderes drinnsteht. Mit dieser Lösung sind dann nur 0,1% der Benutzer verwirrt falls sie die veränderte ID überhaupt bemerken. Was schlimmes passieren kann auf jeden Fall nicht.
du bist wahrscheinlich schon ganz genervt, aber das klingt immer
komischer. wenn ein nutzer ein feld nicht ausfüllen soll und
wenn der eintrag, den du reinschreibst, eh nicht verwendet wird,
dann lass das feld doch ganz weg. im übrigen klingt das, als
könne ein nutzer da jede beliebige id eintragen und damit
vielleicht sogar existierende einträge verändern. näheres
verschweigst du ja leider.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
du bist wahrscheinlich schon ganz genervt, aber das klingt
immer
komischer. wenn ein nutzer ein feld nicht ausfüllen soll und
wenn der eintrag, den du reinschreibst, eh nicht verwendet
wird,
dann lass das feld doch ganz weg. im übrigen klingt das, als
könne ein nutzer da jede beliebige id eintragen und damit
vielleicht sogar existierende einträge verändern. näheres
verschweigst du ja leider.
Das ganze Formular in allen Einzelheiten zu beschreiben ist etwas langwierig. Stell dir vor du hast ein selbst-aufrufendes-Formular um irgendwelche Artikel zu definieren und zu editieren. Die Artikelnummer ist die Autoincrement-ID. Das Formular hat die Navigations-Buttons: speichen, nächster, vorheriger, neu. Die Artikelnummer muss angezeigt werden damit jeder eindeutig weiss um welchen Artikel es sich handelt. Beim Neueintrag eines Artikels hat man natürlich noch keine Artikelnummer. Dafür verwende ich die oben beschriebene ID. Der Nutzer hat keinerlei Zugriff auf die Artikelnummer. Ich will nur das da beim Ausfüllen schon was drinsteht damit der Nutzer nicht denkt er könne dort was eintragen.
Das Formularfeld ist deaktiviert und zeigt die ID lediglich
an.
du wirst sicher beruecksichtigen, dass man „disabled“ deaktivieren kann.
Ich will das Feld bei Neueinträgen nicht leer (NULL)
lassen da der Benutzer sonst glaubt das er dort was ausfüllen
muss. Ich will auch nicht einfach irgendwas als Vorgabe
verwenden da der Benutzer sonst verwirrt ist wenn nach dem
Eintrag was Anderes drinnsteht.
leg doch einfach den eintrag blanko an, dann hast du eine id und wenn er nach 3 tagen noch nicht vervollstaendigt worden ist, killst du ihn
du wirst sicher beruecksichtigen, dass man „disabled“
deaktivieren kann.
Das nützt dem Nutzer aber nichts da ich den neuen Artikel mit autoincrement in die Datenbank eintrage. Der Wert der im Feld steht dient nur zur Information (sozusagen welche Artikelnummer der neue Artikel mit hoher Warscheinlichkeit bekommt).
leg doch einfach den eintrag blanko an, dann hast du eine id
und wenn er nach 3 tagen noch nicht vervollstaendigt worden
ist, killst du ihn
Das führt dazu das es viele ungenutzte ID’s gibt (jede ID die einmal vergeben wurde ist verbrannt). Ausserdem ist mir das zu Umständlich und ich sehe keine Vorteile darin.
Hi soso,
bei Artikeln verwendete ich bisher in den ERPs einen alphanumerischen Artikelcode, die ID ist nur in der DB sichtbar und wird für die Identifikation des Datensatzes bei Joins etc. verwendet.
Der Code kann durch direkte Eingabe entweder einen vorhandenen Artikel aufrufen, oder einen neuen damit erstellen, wenn es ihn nicht gibt. Der Code wird den Usern exklusiv vergeben, also während jemand den Artikel bearbeitet, darf der nächste den Artikel nur schreibgeschützt öffnen. Bei „Neu“ wird der kleinste freie Code vergeben. Frei ist ein Code, der nicht bereits mit einem Artikel gespeichert worden ist und nicht gerade zur Bearbeitung gesperrt ist.
Sobald der User einen Code sieht, ist der für andere User gesperrt, bis er die Bearbeitung abbricht oder speichert. Als Code wird immer der kleinste freie vergeben, da werden die Löcher immer automatisch vom nächsten aufgefüllt. Die Direkteingabe eines nicht existierenden Codes ist ebenfalls möglich (also ohne vorher „neu“ zu klicken). Die IDs sind autoincrement und ebenfalls lückenlos, diese verwendet die Software nur intern, der User sieht diesen nicht. Die Integrität der Daten ist so nicht abhängig von Benutzereingaben, dennoch kann jeder Artikel über eine Benutzereingabe (Code) eindeutig identifiziert werden.
Ist nicht ganz einfach zu programmieren, aber vielleicht dient Dir dieses erprobte Konzept als Anstoß.
Ciao
Rudy
Hallo Rudy,
ich verwende das Autoincrement weil damit sichergestellt ist das eine einmal vergebene Artikelnummer nie wieder vergeben wird. Auch wenn der Artikel irgendwann mal gelöscht wird. Das brauche ich weil ich Verweise von andere Tabellen habe. Wenn ein Verweis dann zu einem anderen Artikel führt gibt das bei mir Chaos.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]