Datenbankfeld automatisch inkrementieren

hi,

in meiner datenbank will ich termine verwalten. um in meiner anwendung einen leichteren zugriff auf die einzelnen einträge zu haben, habe ich als erstes feld eine event_id eingeführt. die soll bei einem neuen eintrag automatisch inkrementiert werden. d.h. ich brauch erst den aktuell höchsten wert von event_id. wie bekomme ich den?

danke
christian

Hallo Christian!

Grundsätzlich geht das mit

SELECT MAX(event\_id) FROM deine\_tabelle;

Vorsicht allerdings bei Mehrbenutzersystemen: Da kannst Du doppelte Werte erhalten, wenn Benutzer A sich eine neue ID holt, aber noch nicht abgespeichert hat (sprich: die Transaktion noch nicht abgeschlossen wurde), während sich Benutzer B eine neue ID holt. Um das zu vermeiden solltest Du Dir entweder einen Locking Mechanismus für das holen neuer Nummern basteln oder Sequences verwenden, da wird’s allerdings RDBMS spezifisch:

Unter Oracle (sicher auch in anderen DBs, aber dort habe ich keine Erfahrung damit) gibt es zusätzlich Sequences, die automatisch immer einen um x (bei der Erstellung anzugeben) erhöhten Wert zurückliefern. Wenn Du mehr Infos brauchst, frag einfach nochmal nach,

Gruß,
TheBeast

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi TheBeast

danke, funktioniert genau wie ich es will. vielleicht kannst du mir auch noch eine zweite frage beantworten. ich habe die termine in einer textdatei verwaltet und will sie jetzt per script in die datenbank pumpen. leider sind bei den einträgen schwerverdauliche zeichen (z.B. Hochkomma (’)) dabei. hast du eine idee, wie ich das umgehen kann?

danke
christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi TheBeast

danke, funktioniert genau wie ich es will. vielleicht kannst
du mir auch noch eine zweite frage beantworten. ich habe die
termine in einer textdatei verwaltet und will sie jetzt per
script in die datenbank pumpen. leider sind bei den einträgen
schwerverdauliche zeichen (z.B. Hochkomma (’)) dabei. hast du
eine idee, wie ich das umgehen kann?

danke
christian

Hi Christian,

Da wird’s jetzt wirklich sehr DB spezifisch. Außerdem kommt es auf das genaue Format der Eingabedatei an (fixe Spaltenbreiten oder CSV [-ähnliches] Format). Im einfachsten Fall machst einfach einen Search & Replace, wo Du die Zeichen in der Datei durch was importierbares (Oracle: z.B. …’… --> …’’… oder …’… --> …’||chr(39))||’… ).

Allgemeiner (und komplizierter) geht’s mit PL/SQL, aber das hilft Dir nur, wenn Du Oracle verwendest.

Gruß,
TheBeast

Hi,

Da wird’s jetzt wirklich sehr DB spezifisch.

aber eigentlich nur, weil nicht jedes DBMS Bind-Variablen beherrscht :wink: mit denen sich das Problem auf 0 reduzieren lässt. Siehe im Zweifel die zugehörige Dokumentation.

Bitte bei Datenbank-spezifischen Fragen _immer_ das verwendete DBMS mit benennen. Fast jede Frage lässt sich ohne diese Angabe nicht hinreichend beantworten.

Cheatah

Hi,

Da wird’s jetzt wirklich sehr DB spezifisch.

aber eigentlich nur, weil nicht jedes DBMS Bind-Variablen
beherrscht :wink: mit denen sich das Problem auf 0 reduzieren
lässt. Siehe im Zweifel die zugehörige Dokumentation.

Hi Cheatah!

Das versteh ich jetzt mal nicht. Was willst Du in dem Zusammenhang mit Bind-Variablen anfangen? Irgendwie steht mir da das Hirn, was ich mit denen beim importieren eines Text-Files tun soll. Hilf mir bitte mal auf die Sprünge.

Danke,
TheBeast

Hi,

Das versteh ich jetzt mal nicht. Was willst Du in dem
Zusammenhang mit Bind-Variablen anfangen? Irgendwie steht mir
da das Hirn, was ich mit denen beim importieren eines
Text-Files tun soll. Hilf mir bitte mal auf die Sprünge.

ich hatte das so verstanden, dass eine Programmlogik die Datei ausliest und zeilenweise in die DB speichert. Im Pseudocode würde das etwa so aussehen:

open(DATEI, '/pfad/zur/datei');
while ($line = DATEI.nextline()) {
 @columns = split($line, '\t');
 sql('INSERT INTO tabelle VALUES (:1, :2, :3)', @columns);
}
close(DATEI);

Wenn ich das Problem falsch verstanden habe, ignoriere bitte meine Antwort :smile:

Cheatah

Hi Cheatah,

so gesehene hast Du natürlich schon recht, ich dachte nur es ginge darum, die Datei mit DB-eigenen Mitteln zu importieren (also im Fall von Oracle entweder per PL/SQL Programm oder mit dem SQL*Loader [oder wie auch immer das Ding genau heißt]). Deswegen mein Hinweis, daß es sehr DB-spezifisch wird (eigentlich in dem Fall sowieso klar).

Gruß nochmal,
TheBeast

Hi,

ich dachte nur es
ginge darum, die Datei mit DB-eigenen Mitteln zu importieren

ach so. Dann haben wir gründlich aneinander vorbeigeredet und beide recht :smile:

Cheatah