getIndexInfo为复合主键返回错误的唯一列

时间:2018-08-28 13:22:46

标签: java database postgresql jdbc

我正在使用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;
}  

我不确定自己做错了什么。任何建议都会有所帮助。谢谢。

1 个答案:

答案 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

只有这样,该列才是唯一的。

因此,在循环中,您还需要计算要检查的列每个索引的列数。只有该索引中的列总数为一,您才能说该列是唯一的。