getIndexInfo возвращает неправильные уникальные столбцы для составных первичных ключей - PullRequest
0 голосов
/ 28 августа 2018

Я работаю с 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 голосов
/ 28 августа 2018

getIndexInfo() возвращает одну строку для каждого столбца и индекса. И оба столбца являются частью первичного ключа, поэтому вы получите две строки в ResultSet, по одной для каждого столбца.

Если вы хотите проверить, является ли столбец уникальным «сам по себе», вам также необходимо подсчитать, сколько строк getIndexInfo() возвращено для каждого индекса.

В вашем случае ResultSet будет выглядеть примерно так:

TABLE_NAME  | INDEX_NAME  | COLUMN_NAME
------------+-------------+------------
bank        | bank_pkey   | bank_id
bank        | bank_pkey   | user_id

Обратите внимание, что в этом результате может быть больше уникальных индексов!

Если бы был уникальный индекс только для bank_id, вы бы получили что-то вроде этого:

TABLE_NAME  | INDEX_NAME  | COLUMN_NAME
------------+-------------+------------
bank        | idx_bank_id | bank_id

Только тогда столбец будет уникальным.

Таким образом, в цикле вам также необходимо подсчитать количество столбцов на индекс , в котором участвует проверяемый столбец. Только если общее число столбцов в этом индексе равно одному, вы можете сказать, что столбец уникален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...