|
1 | 1 | 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