POSTGRESQL 以为是BUG,其实是PG的特性 与感谢

2021-05-06 00:00:00 专区 组合 类型 创建一个 昨天


昨天的文字中,提到了一个自己认为是POSTGRESQL 问题的文字,就是在建立表的时候,在输错类型后,还是会通过,具体请参见昨天的文字.

这边马上姜老师(姜明俊)  和 熊灿灿 给我提示, 然后 的确是自己孤陋寡闻了.


主要的问题在于POSTGRESQL 本身强大的类型支持功能  create type 

https://www.postgresql.org/docs/12/row*.html

先感谢二位老师!!!!


今天好好弄明白,PG的特性  Composite *, 之前是知道这个特性的,这个特性就是通过 create type 的方式自己建立一个属于自己的数据类型(组合).


举例:  下面创建一个化合物的复合类型


 create type compound as (id int,c_name text);

create table compound_t (id int,c_name compound);

insert into compound_t values (1,ROW(1,'suger'));


同时这样的组合的类型可以在函数中引用, 这也是OBJECT 的思维导向的方法.


那么我昨天到底错在哪里, 错在没有仔细阅读官方文档

whenever you create a table, a composite type is also automatically created, with the same name as the table, to represent the table's row type


在我们创建一个表的同时,实际上会自动创建一个以这个表名为命名的type, 所以昨天根本不是什么问题,是我的失误。


通过下面的语句可以看到你的数据库中到底有没有composite 的类型以及他的名字


SELECT n.nspname AS schema,
pg_catalog.format_type ( t.oid, NULL ) AS name,
t.typname AS internal_name,
CASE
WHEN t.typrelid != 0
THEN CAST ( 'tuple' AS pg_catalog.text )
WHEN t.typlen < 0
THEN CAST ( 'var' AS pg_catalog.text )
ELSE CAST ( t.typlen AS pg_catalog.text )
END AS size,
pg_catalog.array_to_string (
ARRAY( SELECT e.enumlabel
FROM pg_catalog.pg_enum e
WHERE e.enumtypid = t.oid
ORDER BY e.oid ), E'\n'
) AS elements,
pg_catalog.obj_description ( t.oid, 'pg_type' ) AS description
FROM pg_catalog.pg_type t
LEFT JOIN pg_catalog.pg_namespace n
ON n.oid = t.typnamespace
WHERE ( t.typrelid = 0
OR ( SELECT c.relkind = 'c'
FROM pg_catalog.pg_class c
WHERE c.oid = t.typrelid
)
)
AND NOT EXISTS
( SELECT 1
FROM pg_catalog.pg_type el
WHERE el.oid = t.typelem
AND el.typarray = t.oid
)
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND pg_catalog.pg_type_is_visible ( t.oid )

ORDER BY 1, 2;




所以昨天问题就是create type 的问题,并且是在建立表的时候,自动建立的type, 自己疏忽又将类型写成 test 才搞出的乌龙.


再次感谢二位老师的指点,同时也更加清晰了,学习一项技术的经验和积累以及三人行必有我师的道理.



相关文章