Sie verwirren die Abstraktionsebenen. Wie andere Antworten bereits hervorheben, CREATE TYPE
registriert nur einen (zusammengesetzten / Zeilen-) Typ im System. Während ein ROW
Der Konstruktor gibt tatsächlich eine Zeile zurück.
Ein mit ROW
erstellter Zeilentyp Der Konstruktor behält keine Spaltennamen bei, was deutlich wird, wenn Sie versuchen, die Zeile in JSON zu konvertieren.
Wenn Sie schon dabei sind, ROW
ist nur ein Noise Word meistens. Die Dokumentation:
Demo:
SELECT t AS r1, row_to_json(t) AS j1
, ROW(1, 'x', NUMERIC '42.1') AS r2, row_to_json(ROW(1, 'x', NUMERIC '42.1')) AS j2
, (1, 'x', NUMERIC '42.1') AS r3, row_to_json( (1, 'x', NUMERIC '42.1')) AS j3
, (1, 'x', '42.1')::myrowtype AS r4, row_to_json((1, 'x', '42.1')::myrowtype) AS j4
FROM (SELECT 1, 'x', NUMERIC '42.1') t;
r1
und j1
ursprüngliche Spaltennamen beibehalten.r2
und j2
nicht.r3
und j3
sind gleich; um zu demonstrieren, wie ROW
ist nur Rauschen.r4
und j4
tragen die Spaltennamen des registrierten Typs.
Sie können die Zeile (Datensatz) in einen registrierten Zeilentyp umwandeln, wenn Zahl und Datentypen der Elemente entsprechen dem Zeilentyp - Namen der Eingabefelder werden ignoriert.