您可以在循环使用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;
听起来像一个有趣的问题:那里既可以成为一个主键或者没有。其他任何内容都是唯一约束或索引。 – duffymo
您不能在表上定义多个主键约束。也许你的意思是单列(可以是复合)的主键? –
如果一个表有2个主键,我希望这个表现在显示出来,但是如果一个表只有1个,我想要那个表。事情是,我没有任何想法如何在java中实现! – Nick