暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL以为是bug,其实是pg的特性

文章转载自公众号: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才搞出的乌龙.

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

规模空前,再创历史 | 2020 PG亚洲大会圆满结束
PG ACE计划的正式发布
三期PostgreSQL国际线上沙龙活动的举办
六期PostgreSQL国内线上沙龙活动的举办

中国PostgreSQL分会与腾讯云战略合作协议签订

PostgreSQL 13.0 正式版发布通告

深度报告:开源协议那些事儿

从“非主流”到“潮流”,开源早已值得拥有

Oracle中国正在进行新一轮裁员,传 N+6 补偿

PostgreSQL与MySQL版权比较

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

四年三冠,PostgreSQL再度荣获“年度数据库”


更多新闻资讯行业动态技术热点,请关注中国PostgreSQL分会官方网站

https://www.postgresqlchina.com

中国PostgreSQL分会生态产品

https://www.pgfans.cn

中国PostgreSQL分会资源下载站

https://www.postgreshub.cn


点击此处阅读原文

↓↓↓

文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论