如何获取 JDBC 中所有表的主键?
Posted
技术标签:
【中文标题】如何获取 JDBC 中所有表的主键?【英文标题】:How to get primary keys for all tables in JDBC? 【发布时间】:2016-11-28 09:36:19 【问题描述】:我有一个至少包含 500 个表的数据库。获取每个表的所有主键和外键的确切代码是什么?
//Primary Key
DatabaseMetaData meta=conn.getMetaData();
ResultSet rs1= meta.getTables(null, null, "TableName" , new String[]"TABLE");
rs1=meta.getPrimaryKeys(null, null, "TableName");
while(rs1.next())
System.out.println("Primary Key :"+rs1.getString(4));
//Foreign Key
rs1=meta.getExportedKeys(null, null, "TableName");
while(rs1.next())
System.out.println("Foreign Key :"+rs1.getString(4));
我已使用此代码,它为我提供了准确的键,但对于 500 个表,我必须更改我的代码 500 次。有什么办法可以减少这种工作量?
【问题讨论】:
【参考方案1】:你不需要修改你的代码500次,你可以使用meta.getTables(null, null, "%", new String[]"TABLE")
检索所有的表名。
getTables
方法对tableNamePattern
参数采用类似模式,因此"%"
匹配所有表名。
getPrimaryKeys
和getExportedKeys
方法不采用模式,因此您需要循环getTables
的结果并为getTables
结果集的每一行执行这些方法。
因此您需要执行以下操作:
try (ResultSet tables = meta.getTables(null, null, "%", new String[] "TABLE" ))
while (tables.next())
String catalog = tables.getString("TABLE_CAT");
String schema = tables.getString("TABLE_SCHEM");
String tableName = tables.getString("TABLE_NAME");
System.out.println("Table: " + tableName);
try (ResultSet primaryKeys = meta.getPrimaryKeys(catalog, schema, tableName))
while (primaryKeys.next())
System.out.println("Primary key: " + primaryKeys.getString("COLUMN_NAME"));
// similar for exportedKeys
我已经包含了目录和模式的检索,因为这可能会影响事情的工作方式。
【讨论】:
非常感谢!主键代码正在运行,但对于外键,它显示此错误 - “列名 COLUMN_NAME 无效。”请指导。 @KaushalDaga 查看java doc ofgetExportedKeys
你可能需要使用PKCOLUMN_NAME
。【参考方案2】:
您可以参考这段代码 sn-p,它向您展示了如何从数据库中获取所有表。
您需要遍历您的 ResultSet
调用 next()。
我已经为 MS SQL Server 2012
尝试过这个public class RetrieveAllTables
public static void main(String[] args)
try
Connection connection = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=HubDB", "sa", "password");
DatabaseMetaData databaseMetaData = connection.getMetaData();
ResultSet resultSet = databaseMetaData.getTables(null, null, "%", new String[] "TABLE");
while(resultSet.next())
System.out.print("Table Catalog: " + resultSet.getString("TABLE_CAT"));
System.out.print("\tTable Schema: " + resultSet.getString("TABLE_SCHEM"));
System.out.print("\tTable Name: " + resultSet.getString("TABLE_NAME"));
System.out.println();
catch (SQLException e)
e.printStackTrace();
返回以下内容作为输出:
Table Catalog: HubDB Table Schema: dbo Table Name: films
Table Catalog: HubDB Table Schema: dbo Table Name: FILMS_AUDIT
Table Catalog: HubDB Table Schema: sys Table Name: trace_xe_action_map
Table Catalog: HubDB Table Schema: sys Table Name: trace_xe_event_map
因此您需要更改以下内容
ResultSet resultSet = databaseMetaData.getTables(null, null, "%", new String[] "TABLE");
到
ResultSet resultSet = databaseMetaData.getTables(null, "dbo", "%", new String[] "TABLE");
可以参考getTables()
方法文档here
使用此信息,您可以动态传递个人TableName
以检索Primary Key
和Foreign Key
详细信息。您现有的代码应该可以很好地通过仅传递一个参数来检索这些详细信息,即上述代码中的TableName
。
【讨论】:
以上是关于如何获取 JDBC 中所有表的主键?的主要内容,如果未能解决你的问题,请参考以下文章