Şu anda tablo tanımları oluşturmak için postgres (9.1) katalogları okumak için bazı SQL oluşturuyorum. Ancak, SERIAL / BIGSERIAL veri türleriyle ilgili bir sorunla karşılaşıyorum.
Misal:
CREATE TABLE cruft.temp ( id BIGSERIAL PRIMARY KEY );
SELECT * FROM information_schema.columns WHERE table_schema='cruft' AND table_name='temp';
"db","cruft","temp","id",1,"nextval('cruft.temp_id_seq'::regclass)","NO","bigint",,,64,2,0,,,,,,,,,,,,,"db","pg_catalog","int8",,,,,"1","NO","NO",,,,,,,"NEVER",,"YES"
Bana veritabanı adı (db), şema adı (cruft), tablo adı (temp), sütun adı (id), varsayılan değer (nextval (...)) ve veri türünü (bigint ve int8 .. bigserial değil) verir ... Sadece varsayılan değerin bir dizi olup olmadığını kontrol edebildiğimi anlıyorum - ancak manuel olarak bir dizi oluşturabildiğim ve varsayılan değerin olduğu seri olmayan bir sütun oluşturabildiğimden bunun% 100 doğru olacağına inanmıyorum. o sıra.
Herkes bunu nasıl başarabilirim hakkında bir öneri var mı? Bir sonraki değer için varsayılan değeri kontrol etmek dışında herhangi bir şey var mı (* _ seq)?
TL; DR veya pg_catalog'i bilmeyen yeni kullanıcılar durumunda eklenen SQL çözümü için düzenlendi:
with sequences as (
select oid, relname as sequencename from pg_class where relkind = 'S'
) select
sch.nspname as schemaname, tab.relname as tablename, col.attname as columnname, col.attnum as columnnumber, seqs.sequencename
from pg_attribute col
join pg_class tab on col.attrelid = tab.oid
join pg_namespace sch on tab.relnamespace = sch.oid
left join pg_attrdef def on tab.oid = def.adrelid and col.attnum = def.adnum
left join pg_depend deps on def.oid = deps.objid and deps.deptype = 'n'
left join sequences seqs on deps.refobjid = seqs.oid
where sch.nspname != 'information_schema' and sch.nspname not like 'pg_%' -- won't work if you have user schemas matching pg_
and col.attnum > 0
and seqs.sequencename is not null -- TO ONLY VIEW SERIAL/BIGSERIAL COLUMNS
order by sch.nspname, tab.relname, col.attnum;