如何在Postgres中找到用户定义类型的属性信息?

时间:2012-02-08 14:42:15

标签: database postgresql

考虑我有一个用户定义的类型如下:

CREATE TYPE mytype AS
 (myvar character(1),
  myvar2 bit(10));

我可以使用Postgres的任何信息表来获取此类型的属性信息:

即。如果给出“mytype”,我想要的信息是:

  • myvar : character(1)
  • myvar2 : bit(10)

2 个答案:

答案 0 :(得分:1)

是的,pg_type表将填充typrelid列。这是pg_class表的OID键,然后在pg_attribute表中使用,就像表,视图,索引等一样。所以就像:

select attname, format_type(atttypid, atttypmod)
from pg_type
     join pg_class on pg_class.oid = pg_type.typrelid
     join pg_attribute on pg_attribute.attrelid = pg_class.oid
where typname = 'mytype'
order by attnum

答案 1 :(得分:0)

除了回复https://stackoverflow.com/a/9195771/6178141之外,我还想添加一些评论。

在这里需要考虑几件事。

1)可以删除属性。是的,可以改变现有类型并添加和/或删除属性。删除的属性在attisdropped列中标记为TRUE,但它们确实采用属性编号。例如,如果我们在上面的DTL中执行以下语句:

 ALTER TYPE mytype ADD ATTRIBUTE abc double precision;
 ALTER TYPE mytype DROP ATTRIBUTE myvar2;

然后属性abc的物理编号为2,而attnum的值为3。

所以我们需要将这个条件添加到WHERE子句:

AND NOT attisdropped

2)还需要考虑类型的架构。 mytype适用于public架构。如果在不同的模式中创建type,则它将不起作用。在这种情况下,我个人更喜欢以下条件:

WHERE attrelid = 'myschema.mytype'::regclass