我正在花一些时间尝试掌握 pg_catalog 表。我假设名称等是从必须单独雕刻字母并且因此非常昂贵的日子回来的;-)无论如何,这都是生活中的事实。我想获得一列的默认值并遇到了这个线程。我看到有人提到希望将 Erwin Brandstetter 的代码作为一个函数。我已经把它包起来,想把它添加到档案中:
CREATE OR REPLACE FUNCTION data.column_default (qualified_name text, column_name text)
RETURNS text
AS $$
SELECT d.adsrc AS default_value -- A human-readable representation of the default value, already typed as text.
FROM pg_catalog.pg_attribute a
LEFT JOIN pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum)
= (d.adrelid, d.adnum)
WHERE NOT a.attisdropped -- no dropped (dead) columns
AND a.attnum > 0 -- no system columns
AND a.attrelid = qualified_name::regclass
AND a.attname = column_name;
$$ LANGUAGE sql;
ALTER FUNCTION data.column_default (qualified_name text, column_name text) OWNER TO user_bender;
我正在像这样使用代码(可能以不人道的方式):
select pg_class.relnamespace::regnamespace as schema_name,
attrelid::regclass as parent_name,
attname,
format_type(atttypid, atttypmod) as data_type,
column_default(attrelid::regclass::text,attname),
attnum
from pg_attribute
left join pg_class on (pg_class.oid = pg_attribute.attrelid::regclass)
从这里我想我会写一个视图等,一旦我更清楚我真正追求的是什么。目前,我使用 CTE 作为临时视图:
with attributes as
(select pg_class.relnamespace::regnamespace as schema_name,
attrelid::regclass as parent_name,
attname,
format_type(atttypid, atttypmod) as data_type,
column_default(attrelid::regclass::text,attname),
attnum
from pg_attribute
left join pg_class on (pg_class.oid = pg_attribute.attrelid::regclass)
)
select *
from attributes
where parent_name::text = 'sales'
欢迎所有更正、改进和建议...我只是在 pg_catalog 中沾沾自喜。