Vous confondez les niveaux d'abstraction. Comme d'autres réponses le soulignent déjà, CREATE TYPE
enregistre uniquement un type (composite / ligne) dans le système. Alors qu'un ROW
constructeur renvoie en fait une ligne.
Un type de ligne créé avec le ROW
constructeur ne conserve pas les noms de colonne, ce qui devient évident lorsque vous essayez de convertir la ligne en JSON.
Pendant que vous y êtes, ROW
n'est qu'un mot bruyant le plus souvent. La documentation :
Démo :
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
et j1
conserver les noms de colonne d'origine.r2
et j2
ne le faites pas.r3
et j3
sont identiques; pour montrer comment ROW
n'est que du bruit.r4
et j4
portent les noms de colonne du type enregistré.
Vous pouvez convertir la ligne (enregistrement) en un type de ligne enregistré si nombre et types de données des éléments correspondent au type de ligne - noms des champs de saisie sont ignorés.