3 Tabellen davon 2 Tabellen in der Haupttabelle übernehmen

Werbung:
Merke: alles, was berechenbar ist, speichert man nicht extra. Start und Ende, Start und Duration, Ende und Duration. NIEMALS NIE alle 3.

kleine frage dazu, wenn ich nur Start und Ende speichere, dann kann ich mir aber nicht per Select ausgeben lassen wieviel Monate mein vertrag ist z.B.: 24 Monate oder 12 Monate ?
Da es ja auch vom typ "character varying" ist lässt sich damit nichts rechnen.

Deshalb hab ich Start und Ende gedacht allerdings brauche ich dann übersichtshalber das begin datum oder das end datum.

Start und Ende sind vom typ integer.

Danke nochmal
 
Da es ja auch vom typ "character varying" ist lässt sich damit nichts rechnen.

Du irrst. Das ist ein RANGE-Typ. Um es mal zu zeigen. Eine Tabelle:

Code:
test=*# create table vertraege(id serial primary key, von_bis tsrange);
CREATE TABLE

Wir füllen diese mit 1 Million Zeilen, also einer eher homeopatischen Menge.

Code:
test=*# insert into vertraege (von_bis) select tsrange('2018-01-01'::date,'2018-01-01'::date + s * '60:00:00'::interval,'[)') from generate_series(1, 1000000) s;
INSERT 0 1000000

Und erstellen einen funktionalen Index auf die Dauer:

Code:
test=*# create index idx_laenge on vertraege ((upper(von_bis)-lower(von_bis)));
CREATE INDEX

Nun mal schauen, welcher davon 10 Monate ist:

Code:
test=*# select * from vertraege where upper(von_bis)-lower(von_bis) = '10 month'::interval;
 id  |  von_bis   
-----+-----------------------------------------------
 120 | ["2018-01-01 00:00:00","2018-10-28 00:00:00")
(1 Zeile)

Das ist etwas, ähm, blöd, weil ein Monat mit 30 Tagen gewertet wird, das ist also etwas unscharf. Davon abgesehen, wir schauen uns den Ausführungsplan an:

Code:
test=*# explain analyse select * from vertraege where upper(von_bis)-lower(von_bis) = '10 month'::interval;
  QUERY PLAN   
------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on vertraege  (cost=119.17..7170.88 rows=5000 width=36) (actual time=0.023..0.023 rows=1 loops=1)
  Recheck Cond: ((upper(von_bis) - lower(von_bis)) = '10 mons'::interval)
  Heap Blocks: exact=1
  ->  Bitmap Index Scan on idx_laenge  (cost=0.00..117.92 rows=5000 width=0) (actual time=0.015..0.015 rows=1 loops=1)
  Index Cond: ((upper(von_bis) - lower(von_bis)) = '10 mons'::interval)
 Planning time: 0.063 ms
 Execution time: 0.042 ms
(7 Zeilen)

test=*#

Dank dem Index dauert es also nur 0,04 Millisekunden, 1 Million Rows nach dieser Bedingung zu durchsuchen.
 
hi,
ok, das heisst du type strange (tsrange)

Hatte mich oben vertan start und end sind vom typ date nicht integer bei mir, geht das dann auch mit meinem bspl., also Date?
Oder soll ich start und end (date-typ) in tsrange ändern.

kleine frage:
idx_laenge index auf die dauer, ist es quasi damit er die Inhalte vergleichen kann?


ich versuche es mal heute Abend.
Danke
 
Hi danke,

mal ne andere frage, wie erstellst du dir dann die Views wenn du das über die Shell machst?
wenn du mal einige Tabellen gejoint hast und dann im Anschluss den selben select Befehl nach 1 Woche wieder brauchst?

Ich finde es mit dem pgAdmin übersichtlicher als über cmd / shell, findest du nicht auch ?

good night.
 
mal ne andere frage, wie erstellst du dir dann die Views wenn du das über die Shell machst?
wenn du mal einige Tabellen gejoint hast und dann im Anschluss den selben select Befehl nach 1 Woche wieder brauchst?

Wo exakt ist da das Problem? Du kannst alle Befehle in Dateien schreiben und diese Dateien dann in psql source, also ausführen. Die Datein kannst Du in einem Versions-Management verwalten.
Und wenn Du einen SQL-Dump machst (Hint: Backup) bekommst Du exakt dasselbe. Das kann ich also alles sogar völlig automatisieren, und muß nicht in einer GUI rumklicken.
 
wow ok, super.
Also muss ich erstmal ein
sql-DUMP erstellen ?

Wie kann ich einen User erstellen der nur auf exakt eine DB Zugang hat da der user der es erstellt hat ja Postgres (ich) ist.

Hab mehrere DB aber einige sind privat.
 
Du kannst alle Befehle wie CREATE TABLE oder so in eine ganz normale Datei schreiben und diese an psql zur Ausführung übergeben. Da ist nix magisches dabei.

Welcher User sich an welche DB verbinden kann regeln die Datei pg_hba.conf. Diese enthält am Anfang eine halben Roman zur Anleitung. Nach einer Änderung ist ein Reload (nur Reload, kein Restart) nötig.
 
habe eine Frage habe eine Tabelle Patchpanel_equipment ohne PK
wie kann ich die Spalte equipmentnr editieren da sich die Geräte die am Panel hängen geändert haben (pc / drucker etc.)

weiss es selbst nicht da ich diese DB so übernommen habe, hab nur gemerkt das ich per GUI keine Editier möglichkeit habe ohne einen PK in einem Table.


=# \d+ patchpanel_equipment
Tabelle „public.patchpanel_equipment“
Spalte | Typ | Attribute | Speicherung | Statistikziel | Beschreibung
-------------+---------+-----------+-------------+---------------+--------------
portid | integer | not null | plain | |
equipmentnr | integer | not null | plain | |
Indexe:
"patchpanel_equipment_portid_key" UNIQUE CONSTRAINT, btree (portid, equipmen tnr)
Fremdschlüssel-Constraints:
"patchpanel_equipment_equipmentnr_fkey" FOREIGN KEY (equipmentnr) REFERENCES equipment(serial) ON UPDATE CASCADE ON DELETE CASCADE



Danke nochmals
 
Viele GUI wollen zwingend einen PK für sowas. Wenn da ein UNIQUE ist, könntest Du diesen sehr leicht in einen PK wandeln, wenn da keine NULL-Werte auftreten.

Code:
test=# create table micky (id int, wal int);
CREATE TABLE
test=*# create unique index micky_unique on micky(id);
CREATE INDEX
test=*# \d micky
  Tabelle »public.micky«
 Spalte |  Typ  | Sortierfolge | NULL erlaubt? | Vorgabewert
--------+---------+--------------+---------------+-------------
 id  | integer |  |  |
 wal  | integer |  |  |
Indexe:
  "micky_unique" UNIQUE, btree (id)
test=*# alter table micky add primary key using index micky_unique;
ALTER TABLE
test=*# \d micky
  Tabelle »public.micky«
 Spalte |  Typ  | Sortierfolge | NULL erlaubt? | Vorgabewert
--------+---------+--------------+---------------+-------------
 id  | integer |  | not null  |
 wal  | integer |  |  |
Indexe:
  "micky_unique" PRIMARY KEY, btree (id)

test=*#

Faustregel: JEDE Tabelle sollte einen PK haben, von Anfang an. Vereinfacht das Leben ungemein.
 
Danke für die info, dachte anfangs die tabelle bezieht die Equipmentnr von einer anderen Tabellen da er sich die Equipmentnr ja zieht ?

z.B.:
SELECT * FROM patchpanel_equipment;


portid | equipmentnr

--------+-------------

60 | 6
62 | 5
63 | 9
64 | 60
9 | 52
9 | 51
12 | 53
25 | 56
27 | 57
36 | 59
36 | 58
45 | 49
46 | 0
24 | 68
56 | 48
45 | 55
49 | 140
35 | 110
28 | 0
40 | 0
59 | 138
22 | 50
18 | 109
13 | 128

(24 Zeilen)

wie kann er sich die equipmentnr ziehen?
 
Danke für die info, dachte anfangs die tabelle bezieht die Equipmentnr von einer anderen Tabellen da er sich die Equipmentnr ja zieht ?

z.B.:
SELECT * FROM patchpanel_equipment;


portid | equipmentnr

--------+-------------

60 | 6

wie kann er sich die equipmentnr ziehen?


Wenn ich wüßte, was Du meinst, könnt ich vielleicht antworten. Bis dahin aber gilt: auch in PG gibt es kein /dev/glaskugel oder vergleichbares.
 
Werbung:
sorry, also z.B frage ich mich wieso auf auf
portID 60 genau die equipmentnr 6 ist
und
PortID 62 genau die equipmentnr 5

das wurde mal so eingestellt richtig ?
Denn es gibt ja in dieser Tabelle keine Vererbung.

Dann kann ich beruhigt den
unique
Key in PK umwandeln?

Wie hat es der Erstelle der DB ohne PK das Feld equipmentnr befüllt ?
 
Zurück
Oben