WITH simple_pk AS (SELECT
n.nspname AS table_schema,
c.relname as table_name,
(SELECT a.attname FROM pg_attribute a WHERE a.attrelid = c.oid AND a.attnum = o.conkey[1] AND a.attisdropped = FALSE) AS column_name
FROM pg_constraint o INNER JOIN pg_class c ON c.oid = o.conrelid
INNER JOIN pg_namespace AS n ON n.oid=c.relnamespace
INNER JOIN pg_authid AS a ON n.nspowner=a.oid
WHERE (n.nspname='public' OR a.rolname<>'postgres')
AND cardinality(o.conkey)=1
AND o.contype = 'p'
AND c.relkind = 'r'
),
simple_fk AS (SELECT
n.nspname AS table_schema,
c.relname as table_name,
(SELECT a.attname FROM pg_attribute a WHERE a.attrelid = c.oid AND a.attnum = o.conkey[1] AND a.attisdropped = FALSE) AS column_name
FROM pg_constraint o INNER JOIN pg_class c ON c.oid = o.conrelid
INNER JOIN pg_namespace AS n ON n.oid=c.relnamespace
INNER JOIN pg_authid AS a ON n.nspowner=a.oid
WHERE (n.nspname='public' OR a.rolname<>'postgres')
AND cardinality(o.conkey)=1
AND o.contype = 'f'
AND c.relkind = 'r'
)
SELECT table_schema, table_name, column_name
FROM simple_pk
WHERE column_name NOT ILIKE '%' || table_name || '%'
AND NOT EXISTS (SELECT *
FROM simple_fk
WHERE simple_pk.table_schema=simple_fk.table_schema
AND simple_pk.table_name=simple_fk.table_name
AND simple_pk.column_name=simple_fk.column_name)
ORDER BY table_schema, table_name;