Eigener Datentyp

Hallo,

ich habe Zahlen in diesem Format 000.000.000

Kann ich einen Datentyp erstellen, damit bei der Eingabe auf dieses Format geachtet wird?

Es gibt dazu den Befehl create TYPE() Was jedoch in die Klammer kommt ist nicht ganz klar.

Karl

Hier ist mal ein ausführliches Beispiel, wie man einen neuen Datentyp erstellt:

BOOLEAN datatype with PHP-compatible output - ads’ corner



test=*# set lc_numeric='de_DE.UTF-8';
SET
test=*# commit;
COMMIT
test=# select to_char(123456789, '999G999G999');
   to_char
--------------
  123.456.789
(1 row)

test=*# select to_number('123.456.789', '999G999G999');
 to_number
-----------
 123456789
(1 row)

reicht das auch?

Andreas

@akretschmer Diese Möglichkeit scheint mir doch um einiges einfacher zu sein.

test=*# set lc_numeric=‘de_DE.UTF-8’;

Es kommt aber eine Fehlermeldung. (Habs direkt in die Konsole eingetragen)

select to_char(123456789, '999G999G999');

Das geht aber.

invalid value for parameter "lc_numeric": "de_DE.UTF-8"

@ads: Vielleicht geh ich das noch später an, ist halt echt ein Aufwand. Erst die Funktionen, Operatoren, Klassen. Da wäre ich eine ganze Weile beschäftigt.

Du brauchst nicht alles davon, jedenfalls nicht, wenn du den Datentyp nur zum Speichern von Daten nutzen willst.

Die Operatoren ect. sind notwendig, wenn du mit anderen Datentypen interagieren möchtest, also z. B. Vergleiche durchführen oder Casten auf andere Typen.

Vermutlich kennt Dein OS das nicht, Du wirst sie dort erst anlegen müssen.

Andreas

Das mit den Datentyp selbst erstellen bekomme ich wohl nicht hin, bzw. ein einfaches Beispiel wäre vielleicht anschaulicher.

Wie lange braucht dazu ein freiberuflicher DB-Programmierer?

Das hängt davon ab, was du alles benötigst …

Deine Vorgaben reichen nicht unbedingt als Lastenheft aus :wink:

Was genau willst Du denn machen damit? So, wie ich Dich verstanden habe, geht es nur darum, ‘normale’ Zahlen in einer bestimmten Formatierung EIN/Auszugeben. Dazu nannte ich eine Lösung.

Hast Du allerdings irgend was besonderes an solchen Zahlen, ich spinne mal: 100.001.010 * 2 soll 100.001.020 sein, dann brauchst halt echt einen neuen Datentypen und dazu die passenden Rechenoperatoren und so weiter.

Also, sag an…

Andreas

Logo, habe noch nicht ein Lastenheft erstellen müssen. Was kommt da alles rein?

Der Datentyp soll im Format 000.000.000 sein.
Also drei Pakete mit je 3 Zahlen welche 0-9 umfassen können
Das Trennzeichen ist ein Punkt

Der Datentyp muss als PrimaryKey verwendet werden können

Es muss keine Addition etc stattfinden können.

Da ich immer gerne auch etwas lernen möchte würde ich auch gerne den Weg dazu sehen. Auf der postgres.org Seite steht ja schon etwas dazu. Bei mir hat es aber noch nicht klick gemacht.

Karl

Da geht es schon los … für die Indexunterstützung (Primary Key) musst du Operatoren für deinen Datentyp haben. Schließlich muss die Datenbank zumindest herausfinden können, ob zwei Datensätze gleich sind. Also müssen Vergleiche möglich sein.

Dann kommen so Sonderfälle hinzu wie:

ist 0001.0001.0001 gleich 001.0001.0001?

Ect ect ect …

Gibt es da vielleicht ein Anfänger-Tutorial?

Nicht wirklich, sorry.
Eigene Datentypen schreiben ist nicht kompliziert, aber es ist Arbeit.

Nach einer Schablone kann man da nicht vorgehen, weil jeder Datentyp anders ist - andernfalls bräuchte man ja keine neuen Typen :wink:


Btw, würden dir nicht drei Spalten, jeweils mit einem Integer, genügen? Dann bildest du aus den drei Spalten den Primary Key.

ja, so haben ich jetzt umgesetzt.

aus den 3 Spalten? also nicht jede einzeln ein primary key, sondern gemeinsam?

Jede Spalte einzeln, also 3 Primary Keys, wird nicht klappen…

  CONSTRAINT "pk" PRIMARY KEY("material_kap", "material_hpos", "material_pos", "material_bereich_id"),

Wie weise ich darauf aber einen Fremdschlüssel zu? (Eine andere Spalte in einer anderen Tabelle soll hier auf alle Primary Keys den Fremdschlüssel haben)

Ich habe noch nicht dazu gesagt, dass die Werte in den Einzelspalten durchaus mehrfach vorkommen können. (z.B. 344) Die Gesamtzahl ist aber einmalig. (344.333.444 und 344.333.445).



test=*# create table t1 (a int, b int, c int, primary key(a,b,c));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1"
CREATE TABLE
Zeit: 5,162 ms
test=*# create table t2 (a int, b int, c int, foreign key(a,b,c) references t1);
CREATE TABLE
Zeit: 28,862 ms

Andreas

CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1"

CREATE TABLE t2 (a int, b int, c int, foreign key(a,b,c) references t1);

Sprich, die Anzahl der Schlüssel muss immer gleich sein. (hier 3: a,b,c)

Macht es dann aber nicht mehr Sinn, einfach noch eine ID-Spalte (etwa Serial) hinzuzufügen und auf diese zu verweisen.?

Ich möchte ja, dass eine Spalte auf 3 Spalten den Fremdschlüssel hat. Und nicht, dass ein Schlüssel 3 Spalten mit 3 Spalten “verknüpft”.

Depends. Wolltest Du einen Unique Constraint auf die 3 Spalten in T1 haben?

Ich möchte ja, dass eine Spalte auf 3 Spalten den Fremdschlüssel hat. Und nicht, dass ein Schlüssel 3 Spalten mit 3 Spalten “verknüpft”.

Hm. Am fehlenden Kaffee kann es einklich nicht liegen, daß ich diesen Satz jetzt nicht verstehe.

Andreas

Ich hatte wohl zu wenig Kaffee…nochmal:


In t1 habe ich einen zusammengesetzten Schlüssel: a, b, c.

t2 soll auf diese Schlüssel verweisen. Müssen deshalb Spalten a, b, c (aus t1) in t2 vorhanden sein? Oder kann man der Spalte x in t2 a, b, c zusammen zuweisen.

Karl