auto_increment

lifehunter

Erfahrenes Mitglied
hi,
ich wollte fragen ob es einen Befehl gibt, der die nächste ID in einer SQL-Datenbank ausgibt. Ich wollte es eben erst so machen das einfach alle IDs gezählt werden und dann 1 dazu gezählt wird. Aber diese Zählung wird sofort falsch, wenn ein mal ein Datensatz gelöscht wurde, weil es dann zb 8 Datensätze gibt aber die höchste ID ist schon 10.
Weiß jemand vielleicht diesen Befehl oder zumindest ob es sollch einen gibt?
 
Das Sql-Statement
Code:
SHOW TABLE STATUS FROM tabelle
liefert dir unter anderem diesen Wert als auto_increment.
Wofür brauchst du den Wert denn wenn ich fragen darf?
 
für mein forum
alle beiträge des gleichen themas bekommen einen gleichen wert ($p). wenn es ein neues thema ist, wird $p gleich der nächsten ID gesetzt.
 
Die wirklich richtige ID bekommst Du doch, wenn Du mit LAST_INSERT_ID die letzte tatsächlich automatisch vergebene ID der Thementabelle holst?
Wenn Du Dir die nächste holst, kann bis zum Eintragen schon ein nebenläufiger Prozess diese ID "klauen", wenn Du Deine DB nicht mit Transaktionen blockierst.

Gruß hpvw
 
aber wenn diese abfrage gerade gemacht wird, wenn es in die datenbank geschrieben wird, dürfte es keine dopplung geben oder?
 
Vielleicht sollten wir erstmal Fakten sammeln:
Dein DBMS ist scheinbar MySQL? Und da es sich um ein Forum handelt mutmaße ich mal, dass Du die DB mit PHP ansprichst.
Dann kommen wir zum entscheidenden Punkt: Wie sieht Deine Datenbank aus? Tabellen, Felder, Feldtypen, Feldbedeutung?
Wie soll Dir sonst jemand ein Query aus dem Hut zaubern?

Gruß hpvw

PS: Klemmt Deine Shift-Taste?
 
Gelegentlich klemmt sie schon ^^
okay Spaß beiseite:
Die Tabelle heißt forum und die wichtigste Spalte ist folgende:

Feld: ID
Typ: int(14)
Attribute: UNSIGNED
Null: Nein
Extra: auto_increment

Ich hoffe jetzt sind alle nötigen Daten genannt.
 
Und in dieser Tabelle speicherst Du die Themen?
In welcher Tabelle speicherst Du die Beiträge?
Wenn das dieselbe Tabelle ist, dann liegt genau dort das Problem, in der Modellierung des Datenbankmodells.

Du hast in einem Forum mehrere 1:n-Beziehungen:
Angenommen Du hast verschiedene Kategorien (Foren).

Du hast also ein Forum mit einer ID. In jedem dieser Foren gibt es mehrere Threads. Ein Thread gehört genau zu einem Forum.

Jeder Thread kann mehrere Beiträge haben. Ein Beitrag gehört genau zu einem Thread.

User gibt es natürlich auch. Ein User kann beliebig viele Beiträge schreiben, aber ein Beitrag wurde von genau einem User geschrieben.

Es bestehen also (je nach Notation) folgende Beziehungen:

Forum <-1-------n-> Thread <-1-------n-> Beitrag <-n-------1-> User

Diese Entitäten werden durch je eine Tabelle dargestellt.

1:n-Beziehungen werden in (relationalen) Datenbanken durch zwei Tabellen dargestellt. Dabei erhält die Tabelle, von der mehrere Datensätze mit einem Datensatz der anderen Tabelle assoziert sein können, den Primärschlüssel (i.d.R. die ID) der anderen Tabelle als Fremdschlüssel.

Jede dieser Tabellen erhält also als Primärschlüssel eine ID, welche "AUTO_INCREMENT" ist.

Assozierte Tabellen erhalten diese ID als Fremdschlüssel.

Daraus ergibt sich folgende grundlegende Struktur, die natürlich um individuell gewünschte Attribute erweitert werden kann (die Tabelle Forum und entsprechend der Fremdschlüssel in der Tabelle Thread kann auch weggelassen werden, wenn man nur ein Forum haben will):

Tabelle Forum
  • ID, int, Primärschlüssel, auto_increment
  • Name, char

Tabelle Thread
  • ID, int, Primärschlüssel, auto_increment
  • ForumID, int, Fremdschlüssel
  • Titel, char

Tabelle Beitrag
  • ID, int, Primärschlüssel, auto_increment
  • ThreadID, int, Fremdschlüssel
  • UserID, int, Fremdschlüssel
  • Inhalt, text

Tabelle User
  • ID, int, Primärschlüssel, auto_increment
  • Name, char

Wenn nun ein neuer Thread angelegt wird, wird dieser zunächst in Thread eingetragen. Mit LAST_INSERT_ID wird die automatisch vom DBMS erzeugte ID ausgelesenen. Dann wird mit dieser ID der Beitrag in die Tabelle Beitrag eingetragen.

Wie Du siehst, benötigt man mit dem richtigen Datenbankdesign den auto_increment-Wert nicht im Voraus.

Gruß hpvw
 
Zurück