В дополнение к ответу https://stackoverflow.com/a/9195771/6178141 Я хотел бы добавить несколько комментариев.
Здесь нужно рассмотреть пару вещей.
1) Там могут быть удалены атрибуты. Да, можно изменить существующий тип и добавить и / или удалить атрибуты. Удаленные атрибуты помечаются как TRUE в столбце attisdropped
, но они принимают номер атрибута. Например, если мы выполним следующие операторы в дополнение к 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
схемы. Если тип создается в другой схеме, он не будет работать. В этом случае я лично больше предпочитаю следующее условие:
WHERE attrelid = 'myschema.mytype'::regclass