Update-Constraint über 3 Tabellen

Kampfgummibaerlie

Datenbank-Guru
Beiträge
728
Ich frage mich, ob es irgendwie möglich ist, mit einem schönen Foreign Key 3 Tabellen gegenseitig up to date zu halten.

In meinem Fall, weil ich mir schwer tue, zu wissen, wielange ein Gerät gemietet wird, wenn ers gerade mal abgeholt hat, auf unbefristete Zeit.

Ich bin in der Lage, einer Timerange (ja, kann ich, seit heute) die Timerange anzugeben im Sinne von einem linken oder rechten Wert. (an sich upper und lower, aber ich schreibe das so, weil die Timerange ja verkehrt sein kann, weil jemand Verspätung hat, oder so)

Ich wäre bereit, eine weitere Tabelle anzulegen, wo von der Vermietungs-Tabelle der lower(timerange) eingetragen wird, und sobald ich (mittels einer Functon) den upper(timerange) Wert angebe, er automatisch von dieser Zwischentabelle, nenne ich sie mal, den lower(timerange)-Wert nimmt, um ihn dann, wenn man in die Function eingibt, wie zum Beispiel: Reihenfolge ist Kunde, Maschine, Timerange, und Kunde, sowie auch Maschine sind bereits eingetragen, und die halbe Timerange, ich möchte jedoch nur 1 der 2 Werte für die Timerange (in einer Zeile) angeben, über mehrere Spalten ist es mir schonmal gelungen :D

Geht das evtl. auch irgendwie über Concat, oder wie das heißt? (das man die 2 Zeilen, die bis auf de Timerange synchron sind, einfach in einer Zeile darstellt?)

Wie ich draufgekommen bin? Ich hatte Zeit, und habe aus meinen alten Threads auch was gelesen ^^

Und habe mich ein wenig gespielt, wird wohl noch eine Weile dauern, bis ich die Reihenfolge von "(" und " ' " und so auswendig kenne, aber ja, wird schon werden :D

Gibt es irgendeine Funktion wie "keep old.Timerange" AS X

Update asda
Set Timerange = '(old.Timerange,current_time)'?
 
Werbung:
Habe hier eine Anrgegung von unserem Mr.Elephant gefunden :)

Re: Spalten zusammenfassen?

Schreibe ich mal hier rein, weil es ja auch eine Art "Zusammenfassung" ist, meine Frage, wie man 1 Range mit 2 angaben eingibt, weiß ich noch (immer) nicht ;)

Aber ich habe richtig Spaß an Postgres ;)
Mehr als beim OoO SQL (ich glaube, die nutzen irgendwas von MS oder so)
 
Also, ich würde gerne 1 Funktionen einbauen, wie du ja weißt, mag ich Funktionen *sie umarme*

Und ich würde gerne mittels einer Funktion den "Endzeitpunkt" eingeben, weil der "Startzeitpunkt" ja definiert ist mittels default-Wert

Habe ich oben anders geschrieben, irgendwas mit 3 Tabellen, aber ja, man wird ja nur klüger, solange man jung ist xD

Aber es will mir nicht gelingen, eine Zeile (mit einer Timerange) updaten, und "nur" den 2. Wert anzugeben.

Sprich:
Ich habe einen Kunden eingetragen, am 17.6.17 08:00, und das ist eine Zeile, auf die ich evtl. später wieder zugreife, weil in der Zwischenzeit ja auch andere Kunden kommen sollten.
Und ich möchte einfach nur den 2. Wert der Timerange angeben, und den bisherigen aber behalten.

Es ist mir bisher aus unersichtlichen Gründen noch nicht gelungen, ich bin aber in der Lage, nur 1 Wert in die Timestamprange einzutragen. '(, x)'

Wobei x natürlich ein Timestamp ist

und ich würde (in diesem Fall) gerne nur den Wert x einfügen. :/

Mir fällts schonwieder ein:
Ich wollte eine Foreign-Key Tabelle bauen, in der diese 1. Zeit reingeschrieben wird, on insert bei Tabelle1, damit man später womöglch noch auf die "Von"-Timestamp zugreifen kann.
 
Zuletzt bearbeitet:
vereinfacht mit int4range:


Code:
test=# create table range_demo(id int primary key, i_range int4range);
CREATE TABLE
test=*# insert into range_demo values (1, '[10,20)');
INSERT 0 1
test=*# insert into range_demo values (2, '[20,)');
INSERT 0 1
test=*# select * from range_demo ;
 id | i_range
----+---------
  1 | [10,20)
  2 | [20,)
(2 Zeilen)

test=*# update range_demo set i_range = int4range(lower(i_range),50,'[)') where id = 2;
UPDATE 1
test=*# select * from range_demo ;
 id | i_range
----+---------
  1 | [10,20)
  2 | [20,50)
(2 Zeilen)

test=*#
 
Dachte ich mir doch, dass Postgres sogar sowas bietet :/

Einen Punkt hätte ich noch zu diesem Thema, damt ich mich (noch) näher damit auseinandersetze (in die entsprechende Datenbank einarbeite):
Wo ist der Unterschied zwischen int4range und int8range?

Habe auf deiner berückstigten Seite auch gelesen, dass es int4range, int8range und daterange eingebaut gibt.

Wo wäre der Unterschied zwischen int4range und int8range?
Daterange glaube ich, sollte recht klar sein, wofür es gut ist (Ich denke mir, die Tage zwischen 2 Daten zählen ^^)

Sicherheitshalber werde ich Googeln, wo der Unterschied zwischen den 2 "eingebauten" Typen ist, und wenn ich das in unter 15 Minuten herausgefunden habe, editiere ichs hier dazu, anderenfalls im nächsten Post.
Wenn ich heute aber nichtmehr dahinterkomme, bin ich (einmal wieder) auf die magischen Finger von mr. Elephant angewiesen :D (Dich mr. Elephent nennen gefällt mir mehr, als dich Akretschmer zu nennen ^^)

Bin ja noch jung, brauche auch meinen Spaß :)

Erstes neue Wissen, was aber irgendwo klar war, die mögliche Speicherkapazität ist größer.
Die nächste Frage wäre, wofür man ernsthaft int8range brauchen könnte? im Jahr 200000000000......1 ?

Habe mich nie wirklich tiefer mit Speicherkapazität auseinandergesetzt, aber ja, 8 byte sind mehr als 4 ;) und ich weiß gerade noch, dass ~8bit einem Byte entsprechen, und so weiter, aber vielmehr schon nichtmehr.

Weitere Frage: Muss ich das irgendwie beim erstellen des Typs integrieren, oder reicht es, wenn ich damit eine Function aufbaue?

Edit der weiteren Frage: genauer lesen, du definierst beim create table code die i_range als int4range, also muss ich mir wohl einen Typen erstellen, der das Ganze

Neue Info: Timestamprange ist eingebaut :D (tsrange)
 
Zuletzt bearbeitet:
Int4 geht von -2147483648 to +2147483647, int8 von -9223372036854775808 to 9223372036854775807. Und ja: rund 2 Milliarden Datensätze in einer Tabelle ist vielleicht nicht für das private Kochrezept von Relevanz, aber in industriellen Anwendungen durchaus nicht selten. Der Spaß hört dann dort auf, wenn man merkt, daß int4 doch zu klein war ...

Integrieren im mathematischen Sinne mußt Du da nicht. Nur die richtigen Datentypen wählen.
 
kann man der tsrange zB den kleineren Wert als default mitgeben? zB, was bei Vermietungen ganz sinnvoll ist, sobald der neue Kunde eingetragen wird, unter anderen Umständen halt einfach "überschreben"

Das gleiche Gilt für den 2. Wert einer Range, kann man eine Function bauen, welche einfach abrufbar ist, und bei Maschine X dann den current_timestamp als 2. Wert einträgt? (Denke ich mal, würde mein herz zu Postgres brechen, wenn nicht :( )

Bekomme folgenden Fehler:
FEHLER: Datum/Zeitwert »current« wird nicht mehr unterstütz

Habe mir eine Tabelle mit Daterange erstellt, weil ich dachte, das reicht aus, aber offenbar nicht(?)
 
Zuletzt bearbeitet:
geht:

Code:
test=# select tsrange(now()::timestamp without time zone, 'infinity'::timestamp without time zone);
  tsrange   
-----------------------------------------
 ["2017-05-23 21:42:41.598853",infinity)
(1 Zeile)
 
Code:
create table vermietungen3 (Kunden_ID integer, Maschinen_ID integer, Mietzeit tsrange default '[now()::timestamp without time zone, 'infinity'::timestamp without time zone']', Mietkosten money);

will irgendwie nicht erstellt werden (vermietungen3, weil ich schon bei 2 gescheitert bin xD)
 
Scheint so zu funktioneren, wie ich es wollte.

Code:
CREATETABLE plop (
id serial PRIMARYKEY,
some_range tstzrange DEFAULT tstzrange(now(),'infinity','[)')
);

Zusätzlich eine Frage:
Was macht das " ' [ ) ' " was vor der letzten geschlossenen Klammer steht?

Denke ich aber, ist nötig, um das ganze entsprechend einzurichten ;)
 
Ein Bereich / Range besteht aus insgesamt 4 Informationen:
  • ist die untere Grenze inclusive oder exclusive
  • untere Grenze
  • obere Grenze
  • ist die obere Grenze inclusive oder exclusive

Die Klammern markieren, ob die Grenzen inclusive [] oder exclusive () sind, die Default-Ausgabe ist immer: inclusive untere Grenze,exclusive obere Grenze

Code:
test=# select '[1,5]'::int4range;
 int4range
-----------
 [1,6)
(1 Zeile)

test=*# select '(1,5)'::int4range;
 int4range
-----------
 [2,5)
(1 Zeile)
 
Werbung:
Die Klammern markieren, ob die Grenzen inclusive [] oder exclusive () sind, die Default-Ausgabe ist immer: inclusive untere Grenze,exclusive obere Grenze

Code:
test=# select '[1,5]'::int4range;
int4range
-----------
[1,6)
(1 Zeile)

test=*# select '(1,5)'::int4range;
int4range
-----------
[2,5)
(1 Zeile)

Anbei eine Bemerkung: Ich glaube, halt so, wie wir alle leben. "Von 8 bis 12", sprich wir gehen vl. vor 12 Uhr wieder heim, und kommen vor 8 Uhr hin ^^

also wäre es sinnlos, das Ganze irgendwie in der Art zu schreiben, weil bei einer Range ja nur 1 Wert inkludiert sein kann, wenn nicht beide ;)
Code:
select '[1],(5)'::int4range
 
Zuletzt bearbeitet:
Zurück
Oben