Auto Increment ID über mehrere Tabellen

Noeden

Erfahrenes Mitglied
Hallo,
also ich habe mehrere Tabellen (4) in denen verschiedene Arten von Datensätzen gespeichert werden. Die sehen verschieden aus, haben aber alle ein Feld `ID`.

Dann gibt es noch eine Tabelle, die aus den Datensätzen aus den anderen Tabellen eine hierarchische Liste erstellen soll. (Durch das Speichern von id, Eltern_id, Position etc)
In dieser Liste können einzelne Datensätze beliebig oft verlinkt sein (0++).

Also muss die ID in den ersten 4 Tabellen einzigartig sein. (ID=3 darf nur in einer der 4 Tabellen einen Treffer bringen). Wie kriege ich das hin? Es können mehrere Benutzer in allen Tabellen Eintragungen machen. Ein einfaches Select vorher bringt also nichts, da in der Zwischenzeit jemand anders einen Eintrag gemacht haben könnte.

Ich hoffe ihr versteht meine Ausführungen und habt eine Idee dazu. Ich finde bei der Suche immer nur Lösungen für das Folgeproblem (die ID des gerade eingetragenen herausfinden).


Danke!
 
Zuletzt bearbeitet:
Also generell würde ich noch eine zusätzliche Tabellen anlegen, in welcher du die IDs speicherst. Diese sollte drei Spalten besitzen: ID, Tabellenname und TabellenID. Tabellennamen und TabellenID sollten einen einzigartigen Index haben (UNIQUE). Wenn jetzt jemand etwas in eine Tabelle einträgt, trägt er erst einmal etwas in die ursprüngliche Tabellen ein und danach in der neuen Tabelle einen Datensatz. Somit kannst du gewährleisten, dass es keine Überschneidung gibt.
 
Hi,
danke, super Idee. Simpel und super. Aber warum brauch ich 3 Spalten? Eigentlich täten es doch auch 2. ID (Auto increment) und Tabellenname. Die ID wird dann in der jeweiligen Tabelle benutzt. Danke
 
Oder du lässt in jeder Tabelle einen normale autoincrement-Spalte laufen und bildest nachher den Unique mit einem Prefix pro Tabelle
 
Das war doch meine Idee, denn du hast doch dann in jeder Tabelle einen eindeutigen Bezeichner pro Datensatz, der aber nur eindeutig in seiner Tabelle ist. Deshalb solltest du als Präfix den Tabellennamen in einer weiteren Spalte speichern.
 
Das konzept die auto increment werte seperat zu tracken nennt Oracle übrigens Sequence.
dort verwendet man dann instead of insert trigger um die sequenznummer in die tabelle zu übernehmen, und folglich können auch mehrere tabellen aus dem selben sequenznummern pool ihre daten beziehen.

Bei MySQL kann man solche sequences bauen indem man einfach eine tabelle anlegt die nur die auto_increment spalte hat. Die information zu welcher tabelle die sequencenumber gehört ist im normalfall zweitrangig und wird üblicherweise nicht gespeichert. Dann fügt man in die tabelle einfach LAST_INSERT_ID() in die ID spalte ein.

Code:
CREATE TABLE seq_mydata (id INT NOT NULL PRIMARY KEY auto_increment);


INSERT INTO seq_mydata VALUES();
INSERT INTO my_data_table (id, randomdata) VALUES (LAST_INSERT_ID(), 'data');


die 2. möglichkeit die du hast, wenn du den grow der tabelle halbwegs abschätzen kannst, ist dass du unterschiedliche ID bereiche definierst.

Code:
CREATE TABLE tbl1 (id INT NOT NULL PRIMARY KEY auto_increment, data VARCHAR(256));
CREATE TABLE tbl2 (id INT NOT NULL PRIMARY KEY auto_increment, data BIGINT);
CREATE TABLE tbl2 (id INT NOT NULL PRIMARY KEY auto_increment, data ENUM('Y','N');

ALTER TABLE tbl1 AUTO_INCREMENT = 1000000;
ALTER TABLE tbl1 AUTO_INCREMENT = 2000000;
ALTER TABLE tbl1 AUTO_INCREMENT = 3000000;

Damit gewinnst du gleichzeitig den vorteil, dass du jederzeit ohne lookup sagen kannst in welcher tabelle der datensatz zu finden it.

Die 3. option die du verwenden kannst, wenn du den DB server selber kontrollierst und sonst nichts darauf läuft was auto_increment verwendest:

du setzt in der my.cnf die option auto_increment_increment auf die anzahl deiner tables.
Dannach legst du deine tables wie oben an:


Code:
auto_increment_increment = 3

CREATE TABLE tbl1 (id INT NOT NULL PRIMARY KEY auto_increment, data VARCHAR(256));
CREATE TABLE tbl2 (id INT NOT NULL PRIMARY KEY auto_increment, data BIGINT);
CREATE TABLE tbl2 (id INT NOT NULL PRIMARY KEY auto_increment, data ENUM('Y','N');

ALTER TABLE tbl1 AUTO_INCREMENT = 1;
ALTER TABLE tbl1 AUTO_INCREMENT = 2;
ALTER TABLE tbl1 AUTO_INCREMENT = 3;

Nun sollte automatisch jeder eintrag eine unterschiedliche id erhalten.
 
Hi, danke, DANKE!

Also ich habe im Moment die Lösung mit zwei Spalten in einer separaten Tabelle laufen, aber die zweite Spalte werde ich wohl auch noch löschen. Wie viel in die Tabellen kommt, ist leider echt schlecht abzuschätzen, sonst wäre das mit den 1000000 echt eine giele Lösung gewesen. Naja, HERZLICHEN DANK
 

Neue Beiträge

Zurück