Veröffentlicht 1. Juni 201114 j Mal wieder eine Frage zu einer Oracle Datenbank. Ich möchte die höchste ID (also den zuletzt eingetragenen Satz) auslesen, um 1 erhöhen und den neuen Wert als ID für den nächsten Datensatz benutzen. Soweit hab ich über Google auch schon ein paar Antworten gefunden, allerdings hänge ich gerade etwas an dieser Stelle: <cfquery name="suche" datasource="#application.datasource#"> SELECT MAX(nutzer_id) AS MaxID FROM nutzer </cfquery> <cfoutput query = "suche"> <table border="0"><br> <tr><td>Höchste ID:</td><td><option value="#suche.nutzer_id#">#suche.nutzer_id#</option></td></tr> </table> </cfoutput> Damit will ich lediglich erstmal testen, ob mir der aktuell höchste Wert der ID ausgegeben wird, allerdings erscheint diese Fehlermeldung: Element NUTZER_ID is undefined in SUCHE Wie genau muss ich den in meiner Such Query definieren? Um den Wert hinterher anzupassen: SELECT MAX(nutzer_id) + 1 AS NewMaxID FROM nutzer Jetzt geht es aber erstmal darum die Fehlermeldung zu beseitigen.
1. Juni 201114 j Autor Ok, das Problem hat sich erledigt. Man sollte auch seine richtigen Bezeichnungen einfügen *grummel* Hab aber auch noch einen anderen Weg gefunden. <cfquery name="suche" datasource="#application.datasource#"> SELECT MAX(nutzer_id) AS nutzer_id FROM nutzer </cfquery> <cfif isdefined("form.nutzer_id")> <cfset nutzer_id = form.nutzer_id><cfelse><cfset nutzer_id = #suche.nutzer_id# + 1></cfif> Und dann bei cfform: <cfform method = "post" name = "anmelden"> <table border="0"> <tr><td>ID:</td><td><cfinput type = "text" maxlength="50" value="#nutzer_id#" name = "nutzer_id" readonly></td></tr> So wird die letzte ID immer um 1 hochgezählt und ins Registrierformular automatisch eingefügt. Durch das readonly kann der Eintrag auch nicht verändert werden. Bin jetzt noch auf der Suche, dass man das ID Feld komplett ausblenden kann.
1. Juni 201114 j Hallo ich weiß ja nicht genau was du "geplant" hast, aber das was ich vermute ist grad im Netzwerk echt "gefährlich" Beispiel: User 1: Ermittelt höchste Nummer => 10 User 2: Ermittelt höchste Nummer => immer noch 10 da noch kein Insert User 1: Insert mit ID 11 User 2: Insert mit ID 11 Ergebnis: DB Verweigert das eintragen des DS da Schlüssel nicht eindeutig
1. Juni 201114 j Autor Vor dem Absenden werd ich noch eine Update Funktion reinhauen. Wenn 10 immer noch die höchste ist, dann ok, wenn nicht auf 11 oder entsprechende Nr. ändern
1. Juni 201114 j leider hab ich keine Ahnung was du da genau abfeierst, aber versuch doch mal mit select sequence_name.nextval() from dual; damit bekommst du die nächste freie id, aber du musst das direkt als Value verwenden, denn durch das select ist bereits hochgezählt worden. versuch diese transaktionssteuerung doch dort zu lassen wo sie bereits funktioniert ^^
1. Juni 201114 j Autor Irgendwie sowas, ja. Wird produktiv nicht eingesetzt, ist in der Abteilung nur als Testprojekt gedacht, da es zu "gefährlich" wäre die Azubis an die Datenbanken, etc. zu lassen.
1. Juni 201114 j naja das ist schon normal so. da kann man einfach viel unsinn machen ohne zu merken das man etwas tut. cascade ist da sowas was ganz übel durchschlagen kann, ohne das der azubi überhaupt weis was los ist. oracle hat aber für solche dinge wie ID's eigentlich immer ne funktionsschnittstelle wie in dem falle das .nextval oder .currval um die nächsten freien ids zu holen.1(man kann die id's blockweise holen, gerade bei RAC oder cloud ist das lebenswichtig) niemals sowas wie x= x+1 dazu benutzen, außer du willst wissen was da alles passieren kann ich merke gerade, ich glaub dir ist nicht bewusst das ein on insert,update trigger mit einer sequenz dein problem löst Oder machst du das extra mal ohne DBMS unterstützung?
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.