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

Das Baerlie scheitert mal wieder :D

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Kampfgummibaerlie, 8 Juni 2019.

  1. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Also, ich habe folgendes "Problem" gefunden:

    Ich würde gerne (falls es kommt), falls alle Maschinen eines Typs gemietet werden, der nächste Zeitpunkt, wo eine frei wird, ausgelesen werden kann.

    Muss ich mich da mit einer if-abfrage beschäftigen?

    Wenn ja, wie frage ich ab, ob eine Maschine des Typs überhaupt schonmal gemietet wurde?
    Bin, wie immer, dankbar für Hilfen ;)

    LG: Baerlie
     
  2. akretschmer

    akretschmer Datenbank-Guru

    vielleicht zeigst Du einfach mal, was Du an Tabellen und Daten hast, was du schon versucht hast und was bei rauskommen soll.
     
  3. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Also:
    Ich habe eine Tabelle Maschinen_Typen (id, name, mietpreis)
    Ich habe eine Tabelle Maschinen (id, typ references maschinen_typen(id))
    Ich habe eine Tabelle Vermietungen (id, mietzeit, maschine references maschinen(id))

    Was ich eigentlich möchte:
    Eine Trigger-Procedure, welche mir bei einem "Error" ausgibt, ab wann eine Maschine dieses Typs wieder mietbar sein wird (für über 2 stunden)

    EDIT1: vl. auch ein wenig nachhilfe beim thema if abfragen in trigger-proceduren

    EDIT2: Die Trigger-Procedure läuft natürlich auf der Tabelle Vermietungen

    EDIT3: Habe schonmal probiert, das ganze mit einer IF-Abfrage in der Triggerprocedure, aber da hat sie mir, selbst wenn ich erst morgen die Miete beantragen würde, den Wert von gestern ausgespuckt. ich denke, einfach ein falsches select geschrieben. (habe den Code nichtmehr)
     
    Zuletzt bearbeitet: 10 Juni 2019 um 12:44 Uhr
  4. akretschmer

    akretschmer Datenbank-Guru

    Ich sehe keine Notwendigkeit für einen TRIGGER.

    Code:
    test=# create table maschinen_typen(id int primary key, name text, mietpreis int);
    CREATE TABLE
    test=*# create table maschinen(id int primary key, typ int references maschinen_typen);
    CREATE TABLE
    test=*# create table vermietungen (id int primary key, mietzeit daterange, maschine int references maschinen, exclude using gist (maschine with =, mietzeit with &&));
    CREATE TABLE
    test=*# insert into maschinen_typen values (1, 'Maschine 1', 10);
    INSERT 0 1
    test=*# insert into maschinen_typen values (2, 'Maschine 2', 20);
    INSERT 0 1
    test=*# insert into maschinen values (1, 1);
    INSERT 0 1
    test=*# commit;
    COMMIT
    test=# insert into vermietungen values (1, '[2019-06-09,2019-06-12)'::daterange, 1);
    INSERT 0 1
    test=*# insert into vermietungen values (2, '[2019-06-10,2019-06-13)'::daterange, 1);
    FEHLER:  kollidierender Schlüsselwert verletzt Exclusion-Constraint »vermietungen_maschine_mietzeit_excl«
    DETAIL:  Schlüssel (maschine, mietzeit)=(1, [2019-06-10,2019-06-13)) kollidiert mit vorhandenem Schlüssel (maschine, mietzeit)=(1, [2019-06-09,2019-06-12)).
    test=*# select * from vermietungen where maschine = 1 and mietzeit && '[2019-06-10,2019-06-13)'::daterange;
     id |        mietzeit         | maschine
    ----+-------------------------+----------
      1 | [2019-06-09,2019-06-12) |        1
    (1 row)
    
    test=*#
    
     
  5. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    ich will die Fehlermeldung ändern, auf den Zeitpunkt, wann sie wieder frei ist.

    muss ich sowas im php programmieren? oder geht das auch Datenbank intern, damit ich last Error anzeigen kann?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    du siehst doch das Ende der Mietzeit ...
     
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