Du forvirrer abstraktionsniveauer. Som andre svar allerede påpeger, CREATE TYPE
registrerer kun en (sammensat / række) type i systemet. Mens en ROW
konstruktør returnerer faktisk en række.
En rækketype oprettet med ROW
constructor bevarer ikke kolonnenavne, hvilket bliver tydeligt, når du forsøger at konvertere rækken til JSON.
Mens du er i gang, ROW
er bare et støjord det meste af tiden. Dokumentationen:
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
og j1
bevar originale kolonnenavne.r2
og j2
ikke.r3
og j3
er det samme; for at demonstrere hvordan ROW
er bare støj.r4
og j4
bære kolonnenavnene af den registrerede type.
Du kan caste rækken (record) til en registreret rækketype hvis nummer og datatyper af elementerne matcher rækketypen - navne af inputfelter ignoreres.