SQL Default Value als Tabellen ID.

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.075
Ich habe eine Frage. Kann man eine Autoincrement ID als Default Value in eine Tabelle festlegen?

Es geht eigentlich um die Sortierung. Es gibt ID und Parent ID. Da es "Kindeinträge" stattfinden sollten, möchte ich dass die Sortierung sich auch nach parent ID richtet. Dabei muss jedes Eintrag das keinen Kind hat die eigene ID als die Parent ID haben, um die reihenfolge der Sortierung nicht durcheinander zu bringen!

ein update ist was unschönes aber wäre auch eine Lösung! Möchte aber eine schönere Lösung dazu finden!
 
ja kann man.
Wie das über reines SQL geht weiß ich nicht (aber ein trigger müsste das können) , aber du könntest ja erst dein eintrag machen, und dann die id auslesen und als parent id eintragen.

edit:
mysql kennt die function LAST_INSERT_ID(), das müsste helfen,

der trigger müsste dann so aufgebaut sein das er NACH dem insert das feld parent ID mit dem wert von LAST_INSERT_ID() füllt.
 
Zuletzt bearbeitet:
Hi,

setz doch einfach eine Ebene darüber an: Wie befüllst du denn die Daten? Wenn es aus einem Programm heraus passiert ist es doch einfach dort schon zu prüfen, ob eine ParentID vorhanden ist - falls nein, übergebe als ParentID einfach die eigene ID. Ausser ich habe das falsch verstanden was du vorhast.

Mercsen hat aber auf alle Fälle damit Recht, dass ein Trigger sowas machen kann. Und: Wenn es zum Einfügezeitpunkt noch keine eigene ID gibt kommst du wohl um ein Update nicht rum. "LAST_INSERT_ID()" ist da mit Vorsicht zu genießen. Ausser du kannst sicherstellen, dass in der Zwischenzeit niemand sonst bereits etwas eingefügt hat (Tablelock z.B.).

Und: lese dir doch bitte vielleicht künftig die Beiträge vor dem Posten durch, für so wenige Zeilen sind das ziemlich viele Fehler - das trägt auch nicht zum Verständnis bei.

VG,
Mad
 
Zuletzt bearbeitet:
ne den trigger werde ich net setzen.

Eine andere Lösung wäre über die View. Da es sowieso auf diese Tabelle View gibt, kann man das ganze switch casen und id setzen. Wäre aber trotzdem super wenn es eine Lösung gäbe (ohne trigger und nur auf Default Value weise) die id der tabelle als parent id zu setzen!
 
nein das geht nicht, rein logisch betrachtet:
wie soll der server die default value bekommen? Die wird festeingetragen.

Aber ich frage mich sowieso, ob nicht eine neue relation, die nur ID's und parent ID's verknüpft sinn machen würde.

Zu last_insert_id():
Das jemand anders daten einträgt musst dir keine sorgen machen, denn es bezieht sich nur auf DEINE verbdinung, sprich liefert die letze ID zurück dieüber deine verbdinung eingetragen wurde.
Krtisch wird es wenn du z.b. 2 datensätze gleichzeitig einträgst, dann bekommst nämlich nur die ID vom ersten eintrag zurück.

wie du das mit einem view lösen willst verstehe ich nicht .....

aber stimmt schon: wie werdem die daten eingetragen? von einem programm? Und was spricht gegen einen update befehl? Manchesmal führt eben kein weg vorbei.

Wenn nicht gerade MySQL nutzt kannst dir auch eine eigene prozedur schreiben und die als default wert nehmen. (denke ich zumindest, lange nimma mit DB2 gearbeitet)
 
Hi,

denn es bezieht sich nur auf DEINE verbdinung

Dann erkläre das mal, wie genau sich "meine Verbindung" definiert. Meinst du das hier:

Die erzeugte Kennung wird auf dem Server verbindungsspezifisch gehandhabt: Der von der Funktion an einen bestimmten Client zurückgegebene Wert ist der erste AUTO_INCREMENT-Wert, der für die zuletzt abgesetzte Anweisung, die eine AUTO_INCREMENT-Spalte betraf, von diesem Client erzeugt wurde

Dann musst du aber eben dazusagen, dass er sich bzw sein Programm dann auch als eigenen Client definiert haben muss bzw andere nicht über die gleichen Verbindungsparameter zugreifen dürfen (was trotzdem in der Praxis oft gemacht wird, wodurch solche Vorteile verspielt werden).

Ausserdem:

Wichtig: Wenn Sie mehrere Datensätze mithilfe einer einzelnen INSERT-Anweisung einfügen, gibt LAST_INSERT_ID() nur denjenigen Wert zurück, der für den ersten eingefügten Datensatz erzeugt wurde.

Sollte man in dem Zusammenhand dann auch erwähnen.

Wenn nicht gerade MySQL nutzt kannst dir auch eine eigene prozedur schreiben

Stored Procedures gehen doch bei MySQL auch vollkommen problemlos.

VG,
Mad
 
Zuletzt bearbeitet:
haha ja du hast recht. Ich dachte an constraints die mysql nicht kann.

Zu last_insert_id():
Das jemand anders daten einträgt musst dir keine sorgen machen, denn es bezieht sich nur auf DEINE verbdinung, sprich liefert die letze ID zurück dieüber deine verbdinung eingetragen wurde.
Krtisch wird es wenn du z.b. 2 datensätze gleichzeitig einträgst, dann bekommst nämlich nur die ID vom ersten eintrag zurück.

zu der verbdinungskennung:
Ich denke nicht, aber weiß es nicht, das sich diese einfach nur aus einem login zusammen setze, sondern soetwas wie IP, port eine rolle spielen, vlt. sogar die gesamte TCP verbindung.

und wenn man solche bdenken hat dann muss man eben für eine eindeutige kennung sorgen. In PHP sind auch 2 verbdinungen die die selben daten nutzen unterscheidbar, selbst wenn sie vom selben script kommen.

und sonst gibt es fast keine möglichkeit sicher an die letze id zu kommen.
Sicher, man könnte jetzt den eben neu eingefügten datensatz suchen und die ID auslesen, aber was wenn, aus welchem gründen auch immer, der selbe schon einmal in der DB war?

dann könnte man natürlich mit max(id) die letze finden, aber wer sagt das nicht am server rumgepfuscht wurde, datensätze 100-200 gelöscht wurden und der counter auf 99 zurpückgesetzt. Klar alles unwahrscheinliche Fälle, aber vorallem da die einträge so schnell passieren besteht für den otto normal user kaum eine gefahr das last_insert_id nicht stimmt.
 
Hi,

Mercsen, ich stimme dir absolut zu - falls es falsch rüber gekommen ist: sorry!

Es geht mir eigentlich momentan auch gar nicht so sehr um die Feinheiten sondern mehr darum, ob sich der TE dieser Fallstricke bewusst ist. Das glaube ich nämlich irgendwie nicht, daher diese Hinweise.

VG,
Mad
 

Ähnliche Themen

Zurück
Oben