PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

A cosa serve un costruttore di riga?

Stai confondendo i livelli di astrazione. Come già sottolineato da altre risposte, CREATE TYPE registra solo un tipo (composito/riga) nel sistema. Mentre una ROW costruttore restituisce effettivamente una riga.

Un tipo di riga creato con ROW costruttore non conserva i nomi delle colonne, il che diventa evidente quando si tenta di convertire la riga in JSON.

Mentre ci sei, ROW è solo una parola rumorosa La maggior parte delle volte. La documentazione:

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;

db<>violino qui
sqlfiddle

r1 e j1 conserva i nomi delle colonne originali.
r2 e j2 non farlo.
r3 e j3 sono gli stessi; per dimostrare come ROW è solo rumore.
r4 e j4 portano i nomi delle colonne del tipo registrato.

Puoi trasmettere la riga (record) a un tipo di riga registrato se numero e tipi di dati degli elementi corrispondono al tipo di riga - nomi dei campi di input vengono ignorati.