為了找到這些資訊我可以費老勁,發現 PostgreSQL 的一個可能的 Bug,還查看 PostgreSQL 的源碼才猜到怎樣能得到有自動成長屬性的欄位。不過總體上感覺比 MS SQL SERVER 的資料結構合理很多。大家可以去找找怎樣得到主鍵屬性的 MS SQL 陳述式。廢話不多說,我把語句格式化了一下希望有助於閱讀。帖出來算是對自由軟體的微末貢獻巴。語句雖然沒有得到全部的資訊,但比較難得到的都已列出來,其它的順著這個思路應該問題不大。
select tbl.relname as TableName,
col.attname as ColumnName,
pg_type.typname as ColumnType,
(case when col.attlen<0 then col.atttypmod else col.attlen end) as ColumnLen,
(select count(*) from pg_constraint ct where ct.contype=p::char and col.attnum = any (conkey) and ct.conrelid=tbl.oid) as IsPk,
(case when seq.oid is null then 0 else 1 end) as IsAutoIncrease,
(case when col.attnotnull=false then 1 else 0 end) as AllowNullable
from pg_attribute col
inner join pg_class tbl on col.attrelid=tbl.oid and tbl.relkind=r::char
left join pg_depend dp on tbl.oid=dp.refobjid and col.attnum=dp.refobjsubid and deptype=i::char
left join pg_class seq on dp.objid=seq.oid and seq.relkind=S::char
inner join pg_namespace space on tbl.relnamespace=space.oid and space.nspname<>pg_catalog::name and space.nspname<>information_schema::name and space.nspname<>pg_toast::name
left join pg_type on col.atttypid=pg_type.oid
where col.attnum>0
order by tbl.relname, col.attnum
Links
PostgreSQL Official Site
PostgreSQL 中文站 在SQL SERVER2000中:
SELECT
(case when a.colorder=1 then d.name else '' end) N'表名',
a.colorder N'欄位序號',
a.name N'欄位名',
(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) N'標識',
(case when (SELECT count(*)
FROM sysobjects
WHERE (name in
(SELECT name
FROM sysindexes
WHERE (id = a.id) AND (indid in
(SELECT indid
FROM sysindexkeys
WHERE (id = a.id) AND (colid in
(SELECT colid
FROM syscolumns
WHERE (id = a.id) AND (name = a.name))))))) AND
(xtype = 'PK'))>0 then '√' else '' end) N'主鍵',
b.name N'類型',
a.length N'佔用位元組數',
COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'長度',
isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小數位元',
(case when a.isnullable=1 then '√'else '' end) N'允許空',
isnull(e.text,'') N'預設值',
isnull(g.[value],'') AS N'欄位說明'
--into ##tx
FROM syscolumns a left join systypes b
on a.xtype=b.xusertype
inner join sysobjects d
on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join syscomments e
on a.cdefault=e.id
left join sysproperties g
on a.id=g.id AND a.colid = g.smallid
order by object_name(a.id),a.colorder
在SQL Server2005中要用extended_properties 代替sysproperties。