使用 DatabaseMetaData Java 在 oracle 中查找没有复合主键的表
Find tables in oracle that dont have composite primary key using DatabaseMetaData Java
String [] tableTypes = { "TABLE" };
DatabaseMetaData md = (DatabaseMetaData) dbConnection.getMetaData();
ResultSet rs = md.getTables(null, null, "%", tableTypes);
while (rs.next()) {
System.out.println(rs.getString(3));
}
我使用这部分代码从我的本地 oracle 数据库中获取所有表,但我需要更改它以便仅取回只有一个主键的平板电脑。有任何想法吗?
Table 最多可以有一个主键。这个主要可以是复合的——即由多列组成。另一个(第二个)键可能是 UNIQUE(+ 不是 NULL),与主键不完全相同。
检查列的最佳方法是查询 ALL_CONTRAINTS 视图。 JDBC 方法 DatabaseMetaData 的功能有限。
您可以为该循环中的每个table使用DatabaseMetaData.getPrimaryKeys()
:
String [] tableTypes = { "TABLE" };
DatabaseMetaData md = dbConnection.getMetaData(); // the cast is unnecessary!
ResultSet rs = md.getTables(null, null, "%", tableTypes);
while (rs.next())
{
String schema = rs.getString(2);
String table = rs.getString(3);
ResultSet pkRs = md.getPrimaryKeys(null, schema, table);
int colCount = 0;
while (pkRs.next())
{
colCount ++;
}
pkRs.close();
if (colCount = 1)
{
System.out.println("Table " + table + " has a single column primary key");
}
}
但是,这会非常慢。使用直接从 user_constraints
和 user_cons_columns
检索此信息的查询将是 很多 更快:
select col.table_name, count(*)
from user_constraints uc
join user_cons_columns col
on col.table_name = uc.table_name
and col.constraint_name = uc.constraint_name
where constraint_type = 'P'
group by col.table_name
having count(*) = 1;
您可以使用此代码:
static Statement statement = null;
static ResultSet result = null;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
try {
Class.forName(driverClassName);
dbConnection = DriverManager.getConnection(url, username, passwd);
statement = dbConnection.createStatement();
String[] tableTypes = {"TABLE"};
DatabaseMetaData dbmd;
dbmd = dbConnection.getMetaData();
result = dbmd.getTables("%", username, "%", new String[]{tableTypes[0]});
while (result.next()) {
String tableName = result.getString("TABLE_NAME");
ResultSet tempSet = dbmd.getPrimaryKeys(null, username, tableName);
String keyName="";
int counter=0;
while (tempSet.next()) {
keyName = tempSet.getString("COLUMN_NAME");
counter++;
}
if(counter == 1) {
System.out.println(tableName);
}
}
} catch (Exception e) {
}
}
String [] tableTypes = { "TABLE" };
DatabaseMetaData md = (DatabaseMetaData) dbConnection.getMetaData();
ResultSet rs = md.getTables(null, null, "%", tableTypes);
while (rs.next()) {
System.out.println(rs.getString(3));
}
我使用这部分代码从我的本地 oracle 数据库中获取所有表,但我需要更改它以便仅取回只有一个主键的平板电脑。有任何想法吗?
Table 最多可以有一个主键。这个主要可以是复合的——即由多列组成。另一个(第二个)键可能是 UNIQUE(+ 不是 NULL),与主键不完全相同。
检查列的最佳方法是查询 ALL_CONTRAINTS 视图。 JDBC 方法 DatabaseMetaData 的功能有限。
您可以为该循环中的每个table使用DatabaseMetaData.getPrimaryKeys()
:
String [] tableTypes = { "TABLE" };
DatabaseMetaData md = dbConnection.getMetaData(); // the cast is unnecessary!
ResultSet rs = md.getTables(null, null, "%", tableTypes);
while (rs.next())
{
String schema = rs.getString(2);
String table = rs.getString(3);
ResultSet pkRs = md.getPrimaryKeys(null, schema, table);
int colCount = 0;
while (pkRs.next())
{
colCount ++;
}
pkRs.close();
if (colCount = 1)
{
System.out.println("Table " + table + " has a single column primary key");
}
}
但是,这会非常慢。使用直接从 user_constraints
和 user_cons_columns
检索此信息的查询将是 很多 更快:
select col.table_name, count(*)
from user_constraints uc
join user_cons_columns col
on col.table_name = uc.table_name
and col.constraint_name = uc.constraint_name
where constraint_type = 'P'
group by col.table_name
having count(*) = 1;
您可以使用此代码:
static Statement statement = null;
static ResultSet result = null;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
try {
Class.forName(driverClassName);
dbConnection = DriverManager.getConnection(url, username, passwd);
statement = dbConnection.createStatement();
String[] tableTypes = {"TABLE"};
DatabaseMetaData dbmd;
dbmd = dbConnection.getMetaData();
result = dbmd.getTables("%", username, "%", new String[]{tableTypes[0]});
while (result.next()) {
String tableName = result.getString("TABLE_NAME");
ResultSet tempSet = dbmd.getPrimaryKeys(null, username, tableName);
String keyName="";
int counter=0;
while (tempSet.next()) {
keyName = tempSet.getString("COLUMN_NAME");
counter++;
}
if(counter == 1) {
System.out.println(tableName);
}
}
} catch (Exception e) {
}
}