import java.io.FileInputStream; import java.sql.*; import java.util.Properties; public class FkSummary { public static void main(String[] args) throws Exception { Properties props = new Properties(); try (FileInputStream in = new FileInputStream(args[0])) { props.load(in); } try (Connection conn = DriverManager.getConnection(props.getProperty("url"), props.getProperty("username"), props.getProperty("password"))) { System.out.println("== FK count by parent table =="); try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( "SELECT OBJECT_NAME(parent_object_id) AS tbl, COUNT(*) AS fk_cnt " + "FROM sys.foreign_keys GROUP BY parent_object_id ORDER BY tbl")) { while (rs.next()) System.out.printf("%-22s %d%n", rs.getString("tbl"), rs.getInt("fk_cnt")); } System.out.println("== tables WITH FKs: " + "see above" + " =="); try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("SELECT COUNT(DISTINCT parent_object_id) FROM sys.foreign_keys")) { rs.next(); System.out.println("tables_with_fk=" + rs.getInt(1)); } try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM sys.tables")) { rs.next(); System.out.println("total_tables=" + rs.getInt(1)); } // self-referencing FKs try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( "SELECT name FROM sys.foreign_keys WHERE parent_object_id = referenced_object_id")) { System.out.println("== self-referencing FKs =="); while (rs.next()) System.out.println(" " + rs.getString("name")); } // composite FKs (more than one column) try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( "SELECT fk.name, COUNT(*) AS cols FROM sys.foreign_keys fk " + "JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id " + "GROUP BY fk.name HAVING COUNT(*) > 1")) { System.out.println("== composite FKs (multi-column) =="); while (rs.next()) System.out.printf(" %s (%d cols)%n", rs.getString("name"), rs.getInt("cols")); } } } }