Ошибка «Нет первичного ключа» с запросом INNER JOIN в PostgreSQL - PullRequest
2 голосов
/ 14 ноября 2011

Дело в том, что обе таблицы имеют первичные ключи, и у меня до сих пор не было никаких проблем с другими стандартными SELECTS / INSERTS. Я новичок в JOINS, но не понимаю, почему это не работает.

Я получаю это сообщение об ошибке:

org.postgresql.util.PSQLException: No primary key found for table devicetable.

Однако первичными ключами для обеих таблиц являются столбцы, для которых я выбираю: deviceid / username. Возможно, это как-то связано с этим?

Я получаю к нему доступ через JDBC

PreparedStatement query = curSQL.getConn().prepareStatement("SELECT devicetable.pushid FROM devicetable, usertable WHERE usertable.username=? AND usertable.deviceid = devicetable.deviceid", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
query.setString(1, username);
ResultSet rs = query.executeQuery();

if (rs.next()){
    rs.updateString("pushid", pushID);
    rs.updateRow();
}

rs.close();
query.close();

С помощью SQL:

SELECT devicetable.pushid FROM devicetable, usertable
WHERE  usertable.username=?
AND    usertable.deviceID = devicetable.deviceID

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Попробуйте явное объединение:

SELECT devicetable.pushid
FROM devicetable
JOIN usertable ON usertable.deviceID = devicetable.deviceID
WHERE usertable.username = ?
1 голос
/ 14 ноября 2011

Предложение JOIN в SELECT не имеет ничего общего с первичными ключами.Вам не нужно указывать первичный ключ для любого запроса SELECT.

Побочным эффектом может быть то, что вы получаете повторяющиеся строки, но это совсем другое дело.

На самом деле, в вашем запросе нет явного JOIN.Вы можете переписать ваш запрос с явным JOIN, как этот эквивалент:

SELECT devicetable.pushid
FROM   devicetable
JOIN   usertable USING (deviceID)
WHERE  usertable.username=?

Подробнее о синтаксисе JOIN читайте в руководстве .

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