Skip to content

Commit 5ad09ed

Browse files
authored
fix: use better fk query (#850)
The query for fetching foreign keys from schema was very inefficient.
1 parent f0613c1 commit 5ad09ed

1 file changed

Lines changed: 32 additions & 31 deletions

File tree

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
11
SELECT DISTINCT
2-
kcu.table_schema::text AS source_schema,
3-
kcu.table_name::text AS source_table,
4-
kcu.column_name::text AS source_column,
5-
ref_kcu.table_schema::text AS ref_schema,
6-
ref_kcu.table_name::text AS ref_table,
7-
ref_kcu.column_name::text AS ref_column,
8-
rc.delete_rule::text AS on_delete,
9-
rc.update_rule::text AS on_update
10-
FROM
11-
information_schema.table_constraints tc
12-
JOIN
13-
information_schema.key_column_usage kcu
14-
ON tc.constraint_catalog = kcu.constraint_catalog
15-
AND tc.constraint_schema = kcu.constraint_schema
16-
AND tc.constraint_name = kcu.constraint_name
17-
JOIN
18-
information_schema.referential_constraints rc
19-
ON tc.constraint_catalog = rc.constraint_catalog
20-
AND tc.constraint_schema = rc.constraint_schema
21-
AND tc.constraint_name = rc.constraint_name
22-
JOIN
23-
information_schema.key_column_usage ref_kcu
24-
ON rc.unique_constraint_catalog = ref_kcu.constraint_catalog
25-
AND rc.unique_constraint_schema = ref_kcu.constraint_schema
26-
AND rc.unique_constraint_name = ref_kcu.constraint_name
27-
AND kcu.position_in_unique_constraint = ref_kcu.ordinal_position
28-
WHERE
29-
tc.constraint_type = 'FOREIGN KEY'
30-
AND tc.table_schema NOT IN ('pg_catalog', 'information_schema')
31-
ORDER BY
32-
source_schema, source_table, source_column;
2+
n.nspname::text AS source_schema,
3+
c.relname::text AS source_table,
4+
a.attname::text AS source_column,
5+
rn.nspname::text AS ref_schema,
6+
rc.relname::text AS ref_table,
7+
ra.attname::text AS ref_column,
8+
CASE con.confdeltype
9+
WHEN 'a' THEN 'NO ACTION'
10+
WHEN 'r' THEN 'RESTRICT'
11+
WHEN 'c' THEN 'CASCADE'
12+
WHEN 'n' THEN 'SET NULL'
13+
WHEN 'd' THEN 'SET DEFAULT'
14+
END AS on_delete,
15+
CASE con.confupdtype
16+
WHEN 'a' THEN 'NO ACTION'
17+
WHEN 'r' THEN 'RESTRICT'
18+
WHEN 'c' THEN 'CASCADE'
19+
WHEN 'n' THEN 'SET NULL'
20+
WHEN 'd' THEN 'SET DEFAULT'
21+
END AS on_update
22+
FROM pg_constraint con
23+
JOIN pg_class c ON c.oid = con.conrelid
24+
JOIN pg_namespace n ON n.oid = c.relnamespace
25+
JOIN pg_class rc ON rc.oid = con.confrelid
26+
JOIN pg_namespace rn ON rn.oid = rc.relnamespace
27+
JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS src(attnum, ord) ON true
28+
JOIN LATERAL unnest(con.confkey) WITH ORDINALITY AS dst(attnum, ord) ON src.ord = dst.ord
29+
JOIN pg_attribute a ON a.attrelid = con.conrelid AND a.attnum = src.attnum
30+
JOIN pg_attribute ra ON ra.attrelid = con.confrelid AND ra.attnum = dst.attnum
31+
WHERE con.contype = 'f'
32+
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
33+
ORDER BY source_schema, source_table, source_column;

0 commit comments

Comments
 (0)