Bạn đang nhầm lẫn mức độ trừu tượng. Như các câu trả lời khác đã chỉ ra, CREATE TYPE
chỉ đăng ký một kiểu (tổng hợp / hàng) trong hệ thống. Trong khi ROW
hàm tạo thực sự trả về một hàng.
Loại hàng được tạo bằng ROW
hàm tạo không bảo toàn tên cột, điều này trở nên rõ ràng khi bạn cố gắng chuyển đổi hàng thành JSON.
Trong khi ở đó, ROW
chỉ là một từ nhiễu hầu hết thời gian. Tài liệu:
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 <> fiddle tại đây
sqlfiddle
r1
và j1
giữ nguyên các tên cột ban đầu.
r2
và j2
không.
r3
và j3
giống nhau; để chứng minh cách ROW
chỉ là tiếng ồn.
r4
và j4
mang tên cột của loại đã đăng ký.
Bạn có thể truyền hàng (bản ghi) sang loại hàng đã đăng ký nếu số và kiểu dữ liệu của các phần tử phù hợp với loại hàng - tên trong số các trường đầu vào bị bỏ qua.