【发布时间】:2016-08-02 12:23:37
【问题描述】:
从我的推断来看,我似乎试图在我的 postgresql 数据库中插入一个新行,并使用一个新的主键组合。然而它抱怨我多次插入相同的键。
证据(来自错误日志):
ERROR com.saxo.read.postgres.RequestLoggingStore - Unable to insert request correctly, uri: /someUrlHere, uuid: a7813f97-7c0d-4739-b20b-a2a6ab2f32a3, at: 1470137399294243
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "requestlogging_pkey"
Detail: Key (id, "timestamp")=(a7813f97-7c0d-4739-b20b-a2a6ab2f32a3, 1470137399294243) already exists.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
....
ERROR com.saxo.read.postgres.RequestLoggingStore - Unable to insert request correctly, uri: /someUrlHere, uuid: 1891dc28-64b8-4a16-8d22-67af6a605aa0, at: 1470137399293662
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "requestlogging_pkey"
Detail: Key (id, "timestamp")=(a7813f97-7c0d-4739-b20b-a2a6ab2f32a3, 1470137399294243) already exists.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
....
如您所见,PQSL 抱怨我有重复的密钥违规,它应该认为,如果我给了它抱怨的值。
(a7813f97-7c0d-4739-b20b-a2a6ab2f32a3, 1470137399294243) 是重复键。但是,从我在 RequestLoggingStore 中的错误日志可以看出,报告的 uuid 和时间戳与 PSQL 报告的不同,并且不是重复键。
我立即假设我在代码中犯了错误,并且报告的 UUID 和时间戳不是我插入到 postgresql 数据库中的内容。但我从下面的代码看不出这是怎么可能的:
public String put(String uri, String method, String body, String headers, String userId) {
String uuid = null;
long timestamp = stamper.timestamp();
try {
uuid = java.util.UUID.randomUUID().toString();
insertQuery.setString(1, uri);
insertQuery.setString(2, body);
insertQuery.setString(3, method);
insertQuery.setString(4, headers);
insertQuery.setString(5, userId);
insertQuery.setLong(6, timestamp);
insertQuery.setString(7, uuid);
insertQuery.execute();
return uuid;
} catch (Exception e) {
logger.error("Unable to insert request correctly, uri: {}, uuid: {}, at: {}", uri, uuid, timestamp, e);
return null;
}
}
以防万一您还想查看插入查询:
insertQuery = postgresConnection.prepareStatement("INSERT INTO "+TableName+"( "+listOfArgs+" ) VALUES ( ?, ?, ?, ?, ?, ?, ? );");
UUID 应该为空,或者与我的错误记录器报告的值相同,对吗?
两者之间怎么会有区别?
是我弄错了还是 psql 的 java 驱动程序有问题?
我正在将所有传入请求记录到我的 Web 服务/API。测试时它似乎工作正常。在高负载下是否会变得压力过大?
【问题讨论】:
-
也显示表架构
-
你能不能有一些触发器在插入时做另一个插入?
-
如果没有 SSCCE,很难回答。我已经使用 PostgreSQL 的 JDBC 连接器好几年了,从来没有发现任何如此严重的问题。您使用的是多线程还是事务?
-
附带说明,不要从
try或catch块内返回。 -
顺便说一句,
insertQuery是在哪里定义的?它在哪里关闭?
标签: java postgresql constraints primary-key sql-insert