
文章转载自公众号:AustinDatabases
作者:carol11
昨天的文字中,提到了一个自己认为是POSTGRESQL问题的文字,就是在建立表的时候,在输错类型后,还是会通过,具体请参见昨天的文字.


这边马上姜老师(姜明俊)和熊灿灿给我提示,然后的确是自己孤陋寡闻了.
主要的问题在于POSTGRESQL本身强大的类型支持功能create type
https://www.postgresql.org/docs/12/rowtypes.html
先感谢二位老师!!!
今天好好弄明白,PG的特性Composite Types,之前是知道这个特性的,这个特性就是通过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才搞出的乌龙.
再次感谢二位老师的指点,同时也更加清晰了,学习一项技术的经验和积累以及三人行必有我师的道理.





新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序

更多新闻资讯,行业动态,技术热点,请关注中国PostgreSQL分会官方网站
https://www.postgresqlchina.com
中国PostgreSQL分会生态产品
https://www.pgfans.cn
中国PostgreSQL分会资源下载站
https://www.postgreshub.cn


点击此处阅读原文
↓↓↓




