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

2021-05-11 14:25:57 浏览数 (1)

昨天的文字中,提到了一个自己认为是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 才搞出的乌龙.

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

0 人点赞