1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

eine ID über mehrere Tabellen

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Kampfgummibaerlie, 24 Juli 2019.

  1. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Ich glaube mich zu erinnern, dass ich eine ähnliche Frage schon einmal bekommen habe, aber um mein jetziges Problem zu Schildern:

    Ich möchte eine Tabelle "Rechnungen" erstellen, wobei das "Produkt" aber von 3 Tabellen abhängen kann. Entsprechend würde ich die ID gerne auf allen 3 Tabellen eindeutig halten.

    Beispiel:
    Ich füge ein Produkt ein (ID gleich 1)
    Ich füge danach einen neuen Stoff ein (ID gleich 2)
    Ich füge danach eine neue Vermietung ein (ID gleich 3)

    Ich glaube, so einen ähnlichen Fall schonmal gehabt zu haben, wo die Lösung einfach lösbar war mittels einer Sequenze.

    Nachdem ich aber keine Ahnung mehr habe, wie das genau funktioniert hat, würde ich gerne einen Code als Beispiel sehen.

    Ich glaube außerdem, dass ich mich zukünftig Primär auf Datenbanken konzentrieren werde, aber andere Programmiersprachen nicht sterben lassen werde. (Werde wohl in Wien Kurse nehmen ab 2020)

    EDIT: Würde mich gerne genauer damit befassen, sprich ein Link zu Übungen, oder das geben von Aufgaben wäre super :D
     
    Zuletzt bearbeitet: 24 Juli 2019
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# create sequence kampgummibaerlie;
    CREATE SEQUENCE
    test=*# create table t1 (id int default nextval('kampgummibaerlie'));
    CREATE TABLE
    test=*# create table t2 (id int default nextval('kampgummibaerlie'));
    CREATE TABLE
    test=*# create table t3 (id int default nextval('kampgummibaerlie'));
    CREATE TABLE
    test=*# insert into t1 (id) values (default);
    INSERT 0 1
    test=*# insert into t3 (id) values (default);
    INSERT 0 1
    test=*# insert into t2 (id) values (default);
    INSERT 0 1
    test=*# insert into t1 (id) values (default);
    INSERT 0 1
    test=*# select * from t1;
     id
    ----
      1
      4
    (2 rows)
    
    test=*# select * from t2;
     id
    ----
      3
    (1 row)
    
    test=*# select * from t3;
     id
    ----
      2
    (1 row)
    
    test=*#
    
     
  3. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Darf ich was verbrechen? ^^

    Kopf -> Tisch

    Einfacher kann mans nicht machen ;D
    Danke Meister Elephant !
     
    akretschmer gefällt das.
  4. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Soda, sicherheitshalber frage ich hier nach, ob ich das richtig mache:

    Ich habe eine Tabelle Vermietungen, eine Tabelle Produkte, eine Tabelle Stoffe.
    Über eine sequence teile ich die ids jeweils nur einmal aus.

    Ich habe mir jetzt eine Trigger-Procedure angelegt, die die IDs on Insert (3 Trigger) in eine Tabelle einfügt.
    Wieso das?

    Ich habe eine Tabelle "Rechnungen", wo ich die IDs als Foreign Key eintragbar machen will.

    Ist meine Lösung "die beste"? ich meine, ja, man kann damit leben, aber ich frage gerne nach Perfektion ;)

    Beispiel: (nicht getestet)
    1.: Sequence erstellen:
    Code:
    create sequence ids;
    
    2.: Tabellen erstellen:
    Code:
    create table vermietungen(id integer primary key default nextval('ids'));
    create table stoffe(id integer primary key default nextval('ids'));
    create table produkte(id integer primary key default nextval('ids'));
    
    3.: Tabelle für alle IDs erstellen:
    Code:
    create table ids(id integer primary key not null);
    
    4.: Trigger Procedure erstellen:
    Code:
    create function insertids() returns trigger as $$
    begin
    insert into ids(id) values (new.id);
    end;
    return new;
    $$ language plpgsql;
    
    5.: die 3 Trigger erstellen:
    Code:
    create trigger id_on_stoff before insert on stoffe for each row execute procedure insertids();
    create trigger id_on_produkt before insert on stoffe for each row execute procedure insertids();
    create trigger id_on_vermietung before insert on stoffe for each row execute procedure insertids();
    
    (Code aus dem Kopf geschrieben, kann zurzeit nicht probieren, bin mal wieder in Kapfenberg)
    Hoffe, die Codes funktionieren, und dass dies die beste Möglichkeit ist xD

    Mir wäre auch eingefallen, eine Trigger-Procedure über if zu machen, sah mir aber im Endeffekt zu komplex aus.

    Danke für eure Meinungen ;)

    LG: Baerlie ;)

    EDIT: Was vergessen und ausgebessert (nextval)
    EDIT2: .... primary key bei ids vergessen, damit er ein FK sein kann...
     
  5. akretschmer

    akretschmer Datenbank-Guru

    wozu dient denn die Tabelle ids?
     
  6. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    damit ich die ids als foreign key in die Tabelle Rechnungen mit den spalten Produkt und Rechnung eintragen kann. es existiert auch eine Tabelle Rechnungsid, mit den spalten id und account.
    hier die id von Rechnungensid gilt als fk für Rechnungen(Rechnung).

    so kommt es mir kompliziert vor, fiel mir beim coden aber recht einfach.

    denke, dass die redundante Tabelle klüger mittels einer trigger Procedere verhindert werden sollte.

    muss mich wohl mit if abfragen in trigger proceduren beschäftigen.
     
  7. castorp

    castorp Datenbank-Guru

    Das klingt für mich alles ein wenig konfus.

    Auf was bezieht sich denn eine Rechnung? Auf ein Produkt und einen Stoff und eine Vermietung gleichzeitig?
    Dann sollte Rechnung drei getrennte Spalten als FKs zu den drei Tabellen haben.

    Oder wird die Rechnung für die Vermietung eines Produktes ausgestellt welches aus einem Stoff (oder mehreren Stoffen) gefertigt wurde?
    Dann reicht ein Fremdschlüssel von Vermietung zu Produkt. Und vermutlich eine many-to-many Beziehung zwischen Produkt und Stoff.
     
  8. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Ich habe versucht 3 FKs einzubauen, das funktioniert aber nicht.

    Weil die ID 1 (zB in Stoffe) nicht in der Tabelle Produkte vorhanden ist, und damit ein error kommt.

    EDIT: nicht gut gelesen, so wie du beschreibst ginge es, aber so wie momentan ist es mir lieber, um ehrlich zu sein. weil dann später die Anwendung einfacher läuft
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden