我正在使用JDBC,并且已经使用postgresql创建了一个简单的表:
create table bank (
bank_id int,
bank_name varchar(40),
bank_address varchar(80),
user_id int,
user_first_name varchar(40),
user_surname varchar(40),
user_phone varchar(12),
primary key(bank_id, user_id)
);
问题是当我检查bank_id是否唯一时,我得到了true(当我期望false时,ofc)。这是我的函数的代码,该代码检查表中的列是否唯一:
private static boolean checkIfUnique(Connection conn, String tableName,
String columnName) {
try {
DatabaseMetaData meta = conn.getMetaData();
ResultSet rs = meta.getIndexInfo(null, null, tableName, true, true);
while(rs.next()) {
if (rs.getString(9).equals(columnName)) {
return true;
}
}
return false;
} catch (Exception e) {
System.err.println("Exception: " + e + "\n" + e.getMessage());
}
return false;
}
我不确定自己做错了什么。任何建议都会有所帮助。谢谢。
答案 0 :(得分:2)
getIndexInfo()
为每一列和索引返回一行。而且这两列都是主键的一部分,因此您在ResultSet中获得两行,每一列各占一行。
如果要检查列是否“唯一”是唯一的,则还需要计算每个索引返回的行getIndexInfo()
的数量。
在您的情况下,ResultSet看起来像这样:
TABLE_NAME | INDEX_NAME | COLUMN_NAME
------------+-------------+------------
bank | bank_pkey | bank_id
bank | bank_pkey | user_id
请注意,结果中可能会有更多唯一索引!
如果在 only bank_id上存在唯一索引,您将具有以下内容:
TABLE_NAME | INDEX_NAME | COLUMN_NAME
------------+-------------+------------
bank | idx_bank_id | bank_id
只有这样,该列才是唯一的。
因此,在循环中,您还需要计算要检查的列每个索引的列数。只有该索引中的列总数为一,您才能说该列是唯一的。