2015-06-01 18 views
1
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数据库中的所有表中的Oracle表是不具有复合主键,但我需要改变它为了找回只有平板电脑的那只有一个主键。有任何想法吗?查找使用的DatabaseMetaData的Java

+2

听起来像一个有趣的问题:那里既可以成为一个主键或者没有。其他任何内容都是唯一约束或索引。 – duffymo

+0

您不能在表上定义多个主键约束。也许你的意思是单列(可以是复合)的主键? –

+0

如果一个表有2个主键,我希望这个表现在显示出来,但是如果一个表只有1个,我想要那个表。事情是,我没有任何想法如何在java中实现! – Nick

回答

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) { 
    } 
} 
0

表最多可以有一个主键。该初级可以是复合的 - 即由多个柱组成。另一个(第二)键可能是UNIQUE(+不是NULL),它与主键不完全相同。

如何检查列的最佳方式是查询ALL_CONTRAINTS视图。 JDBC方法DatabaseMetaData仅具有有限的功能。

2

可以在循环使用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_constraintsuser_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;