前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POSTGRESQL 以为是BUG,其实是PG的特性 与感谢

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

作者头像
AustinDatabases
发布2021-05-11 14:25:57
6490
发布2021-05-11 14:25:57
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

昨天的文字中,提到了一个自己认为是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 的类型以及他的名字

代码语言:javascript
复制
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 才搞出的乌龙.

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档