auto_inkrement

auto_inkrement

am 22.03.2007 14:10:39 von Mathias Fiedler

Hallo,

ich habe eine Datenbank mit mehreren tabellen. Zwei Tabellen sind komplett
gleich aufgebaut, haben nur einen anderen Namen. In bestimmen Fällen kann
es vorkommen, dass ich die Daten aus beiden Tabellen brauche. Das ist an
sich kein Problem. Aber die in den Tabellen vergebene ID (Primary Key und
Auto-Inkrement) kann dann mehrmals vorkommen. Genau einmal je Tabelle. Wenn
ich nun die ID als eindeutiges Kriterium nutzen will, geht das nicht mehr,
denn die kann es ja zweimal geben.
Meine Frage ist, kann ich das auto_inkrement oder auch UNIQE über zwei
Tabellen verwenden? So das also jeder Neueintrag mit dem nächsten Index
beider Tabellen erstellt wird? Ich hoffe, ich konnte mich klar genug
ausdrücken.
Doch nochmal zur Vorsicht. Nehmen wir an es gibt zwei Tabellen, Tab1 und
Tab2. Wenn ich in Tab1 einen Eintrag mache erhält dieser die ID 1 der
nächste die ID 2. Wenn ich jetzt in Tab2 einen eintrag vornehme soll dort
die ID 3 vergeben werden. Läßt sich das automatisiert regeln?

mfg

Mathias

Re: auto_inkrement

am 22.03.2007 14:17:14 von Florian Laws

On 2007-03-22, Mathias Fiedler wrote:
> Hallo,
>
> ich habe eine Datenbank mit mehreren tabellen. Zwei Tabellen sind komplett
> gleich aufgebaut, haben nur einen anderen Namen. In bestimmen Fällen kann
> es vorkommen, dass ich die Daten aus beiden Tabellen brauche. Das ist an
> sich kein Problem. Aber die in den Tabellen vergebene ID (Primary Key und
> Auto-Inkrement) kann dann mehrmals vorkommen. Genau einmal je Tabelle. Wenn
> ich nun die ID als eindeutiges Kriterium nutzen will, geht das nicht mehr,
> denn die kann es ja zweimal geben.

Bist Du sicher, dass Du wirklich zwei Tabellen verwenden willst,
anstatt einer, die ein zusätzliches Feld enthält, das angibt, ob ein
Datensatz in "Tabelle 1" oder "Tabelle 2" gehört?

> Doch nochmal zur Vorsicht. Nehmen wir an es gibt zwei Tabellen, Tab1 und
> Tab2. Wenn ich in Tab1 einen Eintrag mache erhält dieser die ID 1 der
> nächste die ID 2. Wenn ich jetzt in Tab2 einen eintrag vornehme soll dort
> die ID 3 vergeben werden. Läßt sich das automatisiert regeln?

Benutze in Tab1 und Tab2 keine Autoinkremente für die ID, sondern
erzeuge eine weitere Tabelle, die nur die Autoinkrement-ID enthält.
Wenn Du einen neuen ID-Wert brauchst, zieh ihn dir aus dieser Tabelle,
und verwende ihn dann für die eine oder andere.

Grüße,

Florian

Re: auto_inkrement

am 22.03.2007 14:29:33 von Mathias Fiedler

Am Thu, 22 Mar 2007 13:17:14 +0000 (UTC) schrieb Florian Laws:

> On 2007-03-22, Mathias Fiedler wrote:
>> Hallo,
>>
>> ich habe eine Datenbank mit mehreren tabellen. Zwei Tabellen sind komplett
>> gleich aufgebaut, haben nur einen anderen Namen. In bestimmen Fällen kann
>> es vorkommen, dass ich die Daten aus beiden Tabellen brauche. Das ist an
>> sich kein Problem. Aber die in den Tabellen vergebene ID (Primary Key und
>> Auto-Inkrement) kann dann mehrmals vorkommen. Genau einmal je Tabelle. Wenn
>> ich nun die ID als eindeutiges Kriterium nutzen will, geht das nicht mehr,
>> denn die kann es ja zweimal geben.
>
> Bist Du sicher, dass Du wirklich zwei Tabellen verwenden willst,
> anstatt einer, die ein zusätzliches Feld enthält, das angibt, ob ein
> Datensatz in "Tabelle 1" oder "Tabelle 2" gehört?
>
Nein. Ich habe beim beginn meiner Arbeit dieses Problem nicht gesehen.
Jetzt wäre es unheimlich aufwendig, das alles zu ändern. Es geht mir darum,
nicht zu viele unnötige Datensätze ständig mit abfragen zu müssen. Die
Datensätze der zweiten Tabelle werden nur selten benötigt.

>> Doch nochmal zur Vorsicht. Nehmen wir an es gibt zwei Tabellen, Tab1 und
>> Tab2. Wenn ich in Tab1 einen Eintrag mache erhält dieser die ID 1 der
>> nächste die ID 2. Wenn ich jetzt in Tab2 einen eintrag vornehme soll dort
>> die ID 3 vergeben werden. Läßt sich das automatisiert regeln?
>
> Benutze in Tab1 und Tab2 keine Autoinkremente für die ID, sondern
> erzeuge eine weitere Tabelle, die nur die Autoinkrement-ID enthält.
> Wenn Du einen neuen ID-Wert brauchst, zieh ihn dir aus dieser Tabelle,
> und verwende ihn dann für die eine oder andere.
>
Daran hatte ich auch schon gedacht. Ich hatte nur gehofft, man kann beim
erezugen der Tabellen einen solchen Bezug quasi schon mit einbauen. Ich
habe da etwas von Eltern und Kindtabellen und auch von KEY_COLUMN_USAGE
gehört. Leider werd ich daraus nicht so richtig schlau.

Das ist das beispiel:
CREATE TABLE t1
(
s1 INT,
s2 INT,
s3 INT,
PRIMARY KEY(s3)
) ENGINE=InnoDB;

CREATE TABLE t3
(
s1 INT,
s2 INT,
s3 INT,
KEY(s1),
CONSTRAINT CO FOREIGN KEY (s2) REFERENCES t1(s3)
) ENGINE=InnoDB;

Mir ist dabei aber nicht klar, wie sich das auf die einzelnen Tabellen
auswirkt? Wäre das so, das der Schlüssel s2 in der Tabelle t3 vom Schlüssel
s3 in der Tabelle t1 abhängig ist und in beiden Feldern nie der gleiche
Wert steht? In diesem fall gleich die nächste Frage, geht das auch mit
Tabellen die als MyIsam deklariert sind?

mfg

Mathias

Re: auto_inkrement

am 22.03.2007 15:05:00 von Thomas Rachel

Mathias Fiedler wrote:

> Nein. Ich habe beim beginn meiner Arbeit dieses Problem nicht gesehen.
> Jetzt wäre es unheimlich aufwendig, das alles zu ändern. Es geht mir
> darum, nicht zu viele unnötige Datensätze ständig mit abfragen zu müssen.

Macht sich das "zu viele" Abfragen zeitlich bemerkbar? Wenn nicht, laß es
der Einfachheit halber so.


> Die Datensätze der zweiten Tabelle werden nur selten benötigt.

Worin unterscheiden sich diese Datensätze? Vielleicht macht es Sinn, die
Tabellen doch zu verschmelzen und anhand eines gegebenen Kriteriums
(sowieso vorhandenes Datum oder so) zu unterscheiden.


> Daran hatte ich auch schon gedacht. Ich hatte nur gehofft, man kann beim
> erezugen der Tabellen einen solchen Bezug quasi schon mit einbauen. Ich
> habe da etwas von Eltern und Kindtabellen und auch von KEY_COLUMN_USAGE
> gehört. Leider werd ich daraus nicht so richtig schlau.
>
> Das ist das beispiel:
> CREATE TABLE t1
> (
> s1 INT,
> s2 INT,
> s3 INT,
> PRIMARY KEY(s3)
> ) ENGINE=InnoDB;
>
> CREATE TABLE t3
> (
> s1 INT,
> s2 INT,
> s3 INT,
> KEY(s1),
> CONSTRAINT CO FOREIGN KEY (s2) REFERENCES t1(s3)
> ) ENGINE=InnoDB;
>
> Mir ist dabei aber nicht klar, wie sich das auf die einzelnen Tabellen
> auswirkt? Wäre das so, das der Schlüssel s2 in der Tabelle t3 vom
> Schlüssel s3 in der Tabelle t1 abhängig ist und in beiden Feldern nie der
> gleiche Wert steht?

Nein. Ich habe noch nie nennenswert mit InnoDB gearbeitet, aber es ist wohl
so, daß hier nur Werte für t3.s2 zulässig sind, die auch irgendwo in t1.s3
auftauchen.


> In diesem fall gleich die nächste Frage, geht das auch
> mit Tabellen die als MyIsam deklariert sind?

Nein.


Thomas
--
Fernsehen ist die aktive Form des Faulenzens. (Henning Venske)

Re: auto_inkrement

am 22.03.2007 15:21:22 von Florian Laws

On 2007-03-22, Mathias Fiedler wrote:
> Am Thu, 22 Mar 2007 13:17:14 +0000 (UTC) schrieb Florian Laws:
>> On 2007-03-22, Mathias Fiedler wrote:
>>> Hallo,
>>>
>>> ich habe eine Datenbank mit mehreren tabellen. Zwei Tabellen sind komplett
>>> gleich aufgebaut, haben nur einen anderen Namen. In bestimmen Fällen kann
>>> es vorkommen, dass ich die Daten aus beiden Tabellen brauche. Das ist an
>>> sich kein Problem. Aber die in den Tabellen vergebene ID (Primary Key und
>>> Auto-Inkrement) kann dann mehrmals vorkommen. Genau einmal je Tabelle. Wenn
>>> ich nun die ID als eindeutiges Kriterium nutzen will, geht das nicht mehr,
>>> denn die kann es ja zweimal geben.
>>
>> Bist Du sicher, dass Du wirklich zwei Tabellen verwenden willst,
>> anstatt einer, die ein zusätzliches Feld enthält, das angibt, ob ein
>> Datensatz in "Tabelle 1" oder "Tabelle 2" gehört?
>>
> Nein. Ich habe beim beginn meiner Arbeit dieses Problem nicht gesehen.
> Jetzt wäre es unheimlich aufwendig, das alles zu ändern. Es geht mir darum,
> nicht zu viele unnötige Datensätze ständig mit abfragen zu müssen. Die
> Datensätze der zweiten Tabelle werden nur selten benötigt.

Vielleicht helfen Dir Views, die "Tabelle 1" und "Tabelle 2"
darstellen?

Grüße,

Florian

Re: auto_inkrement

am 22.03.2007 16:28:29 von Mathias Fiedler

Am Thu, 22 Mar 2007 14:21:22 +0000 (UTC) schrieb Florian Laws:

> On 2007-03-22, Mathias Fiedler wrote:
>> Am Thu, 22 Mar 2007 13:17:14 +0000 (UTC) schrieb Florian Laws:
>>> On 2007-03-22, Mathias Fiedler wrote:
>>>> Hallo,
>>>>
>>>> ich habe eine Datenbank mit mehreren tabellen. Zwei Tabellen sind komplett
>>>> gleich aufgebaut, haben nur einen anderen Namen. In bestimmen Fällen kann
>>>> es vorkommen, dass ich die Daten aus beiden Tabellen brauche. Das ist an
>>>> sich kein Problem. Aber die in den Tabellen vergebene ID (Primary Key und
>>>> Auto-Inkrement) kann dann mehrmals vorkommen. Genau einmal je Tabelle. Wenn
>>>> ich nun die ID als eindeutiges Kriterium nutzen will, geht das nicht mehr,
>>>> denn die kann es ja zweimal geben.
>>>
>>> Bist Du sicher, dass Du wirklich zwei Tabellen verwenden willst,
>>> anstatt einer, die ein zusätzliches Feld enthält, das angibt, ob ein
>>> Datensatz in "Tabelle 1" oder "Tabelle 2" gehört?
>>>
>> Nein. Ich habe beim beginn meiner Arbeit dieses Problem nicht gesehen.
>> Jetzt wäre es unheimlich aufwendig, das alles zu ändern. Es geht mir darum,
>> nicht zu viele unnötige Datensätze ständig mit abfragen zu müssen. Die
>> Datensätze der zweiten Tabelle werden nur selten benötigt.
>
> Vielleicht helfen Dir Views, die "Tabelle 1" und "Tabelle 2"
> darstellen?

Leider nicht. Es handelt sich um Artikeldaten. Es gibt Artikel, die nur
einem speziellen Kunden zugeordnet sind. Da es relativ viele sind, wollte
ich die in einer zweiten Tabelle haben. Die werden nur selten benötigt.
Wenn die Daten aber gebraucht werden, dann immer auch im Zusammenhang mit
der ersten Zabelle. Die Überschneidung von Feldern ist mir leider erst
jetzt bewusst geworden. -> bessere Planung hätte das Problem gar nicht erst
aufkommen lassen, aber jetzt ist es nunmal so.
Ich habe die Idee mit der auto_inkrement tabelle verarbeitet. Das war die
einfachste Lösung. Diese Tabelle wird nur bei der Neuanlage von Artikeln
benötigt. Und das kommt nicht jeden Tag 1000 mal vor.

Danke an alle für die Hinweise.

mfg

Mathias

Re: auto_inkrement

am 24.03.2007 14:34:59 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)