Бъркате нивата на абстракция. Както вече посочват други отговори, CREATE TYPE
регистрира само тип (съставен / ред) в системата. Докато ROW
конструкторът всъщност връща ред.
Тип ред, създаден с ROW
конструкторът не запазва имена на колони, което става очевидно, когато се опитате да конвертирате реда в JSON.
Докато сте там, ROW
е просто шумна дума през повечето време. Документацията:
Демо:
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
и j1
запазва оригиналните имена на колони.r2
и j2
недей.r3
и j3
са същите; за да демонстрирате как ROW
е просто шум.r4
и j4
носят имената на колоните от регистрирания тип.
Можете да прехвърлите реда (записа) към регистриран тип ред, ако номер и типове данни от елементите съответстват на типа ред - имена от полетата за въвеждане се игнорират.