Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用DatabaseMetaData Java查找oracle中没有复合主键的表_Java_Oracle_Jdbc - Fatal编程技术网

使用DatabaseMetaData Java查找oracle中没有复合主键的表

使用DatabaseMetaData Java查找oracle中没有复合主键的表,java,oracle,jdbc,Java,Oracle,Jdbc,我使用这部分代码从本地oracle数据库中获取所有表,但我需要更改它,以便只获取只有一个主键的平板电脑。有什么想法吗 表最多可以有一个主键。此主列可以是复合列,即由多个列组成。另一个(第二个)键可能是唯一的(+非空),它与主键不完全相同 检查列的最佳方法是查询所有约束视图。JDBC方法数据库元数据的功能有限。您可以对该循环中的每个表使用: String [] tableTypes = { "TABLE" }; DatabaseMetaData md = (DatabaseMetaData

我使用这部分代码从本地oracle数据库中获取所有表,但我需要更改它,以便只获取只有一个主键的平板电脑。有什么想法吗

表最多可以有一个主键。此主列可以是复合列,即由多个列组成。另一个(第二个)键可能是唯一的(+非空),它与主键不完全相同

检查列的最佳方法是查询所有约束视图。JDBC方法数据库元数据的功能有限。

您可以对该循环中的每个表使用:

String [] tableTypes = { "TABLE" };
    DatabaseMetaData md = (DatabaseMetaData) dbConnection.getMetaData();
    ResultSet rs = md.getTables(null, null, "%", tableTypes);
    while (rs.next()) {
        System.out.println(rs.getString(3));
    }
然而,这将是非常缓慢的。使用直接从
user\u constraints
user\u cons\u列
检索此信息的查询将是一个批量更快的查询:

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");
  }
}

您可以使用以下代码:

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;

听起来像是一个技巧性的问题:可以有一个主键,也可以没有主键。其他任何东西都是唯一的约束或索引。仔细听:没有包含两个主键的表。表要么有一个主键,要么根本没有主键,称为复合主键。您仍然有一个主键约束。您是否考虑过阅读
DatabaseMetaData
的文档,看看它是否有任何方法可以帮助您获取所需的信息?getTables()不会返回该信息。您需要为每个表使用
getPrimaryKeys()
,并查看它返回的列数:
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) {
    }
}