Problem eine Relation zwischen zwei Tabellen herzustellen (MySQL)

enrix

Mitglied
Hallo,

ich habe ein sehr wichtige frage zu einem einfachen Problem. Seit kurzem erlerne ich den Umgang mit Datenbanken. dabei bin ich auf ein Problem gestoßen, welches ich nur schwer formulieren kann.

wenn man einer Tabelle einen neuen Datensatz einfügt und in dieser Tabelle der Wert des Primärschlüssels durch Auto_Increment (d.h. der Anwender kennt den Wert des Schlüssel_id von dem neuen Datensatz nicht) erzeugt wird, kann man dann den Wert dieses Primärschlüssels des eingefügten Datensatzes ausgeben oder ermitteln?
Das aufsuchen des Datensatzes durch andere Attribute ist leider nicht möglich, da die anderen Attribute keine Eindeutigkeit aufweisen.

Beispiel
ich möchte Reservierungen in einer Tabelle einfügen. Und eine Relation zwischen dem Gast und seine getätigten Reservierungen erzeugen.
Code:
CREATE TABLE Reservierung (
id INT NOT NULL AUTO_INCREMENT,
status varchar(10),
anmerkung varchar(250),
PRIMARY KEY(ID)
);

CREATE TABLE Gast(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(60),
vorname VARCHAR(60),
PRIMARY KEY(ID)
);

bei jeder neuen Reservierung sollen die ID's des neuen Datensatzes in die Tabelle reserviert übertragen werden.

CREATE TABLE reserviert (
reservierung_id INT,
Gast_id INT,
PRIMARY KEY (reservierung_id, Gast_id),
FOREIGN KEY (reservierung_id) REFERENCES reservierung (ID),
FOREIGN KEY (Gast_id) REFERENCES Gast (ID)
);
wie man sieht, tritt das Problem auf, dass bei einer neuen Reservierung die entsprechende ID in die Tabelle reserviert übertragen werden muss. Da die Tabelle "reserviert" die Relation zwischen den beiden Tabellen "Gast" und "Reservierung" bildet benötigt sie auch die ID der Tabelle "Gast". Gibt es eine Möglichkeit bei einem neuen Eintrag in die Tabelle "Reservierung" die reservierung_id und Gast_id in die Tabelle "reserviert" automatisch einzufügen? Oder liegt hier ein Denkfehler vor?


MFG
enrix
 
Hallo,

...kann man dann den Wert dieses Primärschlüssels des eingefügten Datensatzes ausgeben oder ermitteln?
MFG
enrix


Hallo,

In ORACLE exisitiert dazu das Schlüsselwort RETURNING

Beispiel (Die ID wird über eine Sequence in einem Trigger erzeugt, also "unsichtbar")

Tabelle example (ID, field1)

Code:
INSERT into example (field1) values  ('bla") 
RETURNING ID into myvariable;

Gruss
 
Hi,

wofür brauchst Du denn die 3. Tabelle? Wenn Du die ID des Gastes in der Tabelle "Reservierung" speicherst, müsste das doch vollkommen ausreichen. Oder möchtest Du in der Tabelle "reserviert" sämtliche Familienmitglieder für eine einzelne Reservierung speichern?

LG
 
Hi,

wofür brauchst Du denn die 3. Tabelle? Wenn Du die ID des Gastes in der Tabelle "Reservierung" speicherst, müsste das doch vollkommen ausreichen. Oder möchtest Du in der Tabelle "reserviert" sämtliche Familienmitglieder für eine einzelne Reservierung speichern?

LG
Er löst ein m:n Beziehung damit auf. In diesem Use Case allerdings eher unnötig, sehe ich auch so


Gruss
 
danke für die schnelle Hilfe. Ich könnte auch postgresql nehmen und eine Funktion schreiben. Habe gerade gelesen, dass es bei Postgresql auch seit 8.2 das Returing unterstützt.

würde dann dann so aussehen

Code:
CREATE OR REPLACE FUNCTION getRes_ID(VARCHAR(60),VARCHAR(60)) RETURNS integer AS 
$BODY$
DECLARE
    id INTEGER,
BEGIN
            INSERT INTO reservierung(status, anmerkung) VALUES ($1,$2)
            RETURNING gid INTO id;
           
           RETURN id;

END;  
$BODY$
LANGUAGE ‘PLPGSQL’;

könnte ich jetzt folgenden SQL-Befehl anwenden? Oder versteht man unter einer guten Lösung etwas anderes?

Code:
INSERT INTO reserviert(Gast_ID,reservierung_ID) VALUES (getGast_ID('Mustermann'), getRes_ID('gültig','keine'));

I
 
danke für die schnelle Hilfe. Ich könnte auch postgresql nehmen und eine Funktion schreiben. Habe gerade gelesen, dass es bei Postgresql auch seit 8.2 das Returing unterstützt.

würde dann dann so aussehen

Code:
CREATE OR REPLACE FUNCTION getRes_ID(VARCHAR(60),VARCHAR(60)) RETURNS integer AS 
$BODY$
DECLARE
    id INTEGER,
BEGIN
            INSERT INTO reservierung(status, anmerkung) VALUES ($1,$2)
            RETURNING gid INTO id;
           
           RETURN id;

END;  
$BODY$
LANGUAGE ‘PLPGSQL’;

könnte ich jetzt folgenden SQL-Befehl anwenden? Oder versteht man unter einer guten Lösung etwas anderes?

Code:
INSERT INTO reserviert(Gast_ID,reservierung_ID) VALUES (getGast_ID('Mustermann'), getRes_ID('gültig','keine'));

I

- Nun , ich kenne postgres nicht. Wichtig ist einfach, dass dies in einer Transaktion abläuft (Und das du deine Beziehung Gast-Reservierung mittes Foreign - Key's schützt)


Gruss
 
Hi,

wofür brauchst Du denn die 3. Tabelle? Wenn Du die ID des Gastes in der Tabelle "Reservierung" speicherst, müsste das doch vollkommen ausreichen. Oder möchtest Du in der Tabelle "reserviert" sämtliche Familienmitglieder für eine einzelne Reservierung speichern?

LG

ehrlich gesagt, habe ich bei uns an der Uni diese Art der Beziehungskonstruktion zwischen zwei Tabellen gelernt. In den Übungsbeispielen wurden alle Tabellen auf diese Weise zueinander in Beziehung gesetzt. Das ist jedoch mein erstes praktisches Beispiel und ich erkenne, dass man Datenbankbeispiele aus Lehrbüchern sehr schnell erfassen kann aber die praktische Umsetzung ist sehr viel komplexer. Wobei für euch das sicher in 5 Minuten getan ist. Habe noch kurz eine Frage zu den angesprochenen Transaktionen. Ich habe das so verstanden, dass Transaktionen prozedurale Blöcke einleiten und auch beenden. An welcher Stelle meiner Datenbankanwendung spielen Transaktionen eine Rolle und spricht man diese Transaktionen eine besondere Bedeutung zu? Handelt es sich bei meiner Funktion getRes_ID() um eine Transaktion?
 
Zurück