PostgreSQL中的INNER JOIN查询出现“无主键”错误

时间:2011-11-14 05:04:17

标签: postgresql join jdbc primary-key

问题是,两个表都有主键,到目前为止我还没有遇到任何其他标准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 个答案:

答案 0 :(得分:2)

尝试显式联接:

SELECT devicetable.pushid
FROM devicetable
JOIN usertable ON usertable.deviceID = devicetable.deviceID
WHERE usertable.username = ?

答案 1 :(得分:1)

SELECT中的JOIN子句与主键无关。您不需要为任何 SELECT查询定义主键。

副作用可能是您获得了重复的行,但这完全是另一回事。

实际上,查询中有显式JOIN。您可以使用明确的JOIN重写您的查询,如下所示:

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

详细了解JOIN syntax in the manual