You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-user@db.apache.org by Raymond Kroeker <ra...@gmail.com> on 2008/04/08 18:32:35 UTC
Identity Column/Unique Constraint
Hi All,
I've upgraded from derby 10.2.2.0 to 10.3.2.1. My application
caches prepared statements (or more accurately uses dbcp to cache
connections/statements) and now the queries I'm using to
insert/retrieve identity column values no longer work.
I can run this code fine using 10.2.2.0; then upgrade the same db
to 10.3.2.1 and run the same code again and it fails. I checked the
release notes specifically the identity tickets; but could not find
anything I thought was relevant. The symptom is that subsequent
attempts to insert the identity fail with a unique constraint
exception:
java.sql.SQLIntegrityConstraintViolationException: The statement was
aborted because it would have caused a duplicate key value in a unique
or primary key constraint or unique index identified by
'SQL080408092334110' defined on 'X'.
at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown
Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown
Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown
Source)
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeUpdate(Unknown
Source)
at genkeys.Main.runGenerateKeys(Main.java:89)
at genkeys.Main.run(Main.java:73)
at genkeys.Main.main(Main.java:39)
Caused by: java.sql.SQLException: The statement was aborted because
it would have caused a duplicate key value in a unique or primary key
constraint or unique index identified by 'SQL080408092334110' defined
on 'X'.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown
Source)
at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
Source)
... 12 more
Caused by: ERROR 23505: The statement was aborted because it would
have caused a duplicate key value in a unique or primary key
constraint or unique index identified by 'SQL080408092334110' defined
on 'X'.
at org.apache.derby.iapi.error.StandardException.newException(Unknown
Source)
at org.apache.derby.impl.sql.execute.IndexChanger.insertAndCheckDups(Unknown
Source)
at org.apache.derby.impl.sql.execute.IndexChanger.doInsert(Unknown Source)
at org.apache.derby.impl.sql.execute.IndexChanger.insert(Unknown Source)
at org.apache.derby.impl.sql.execute.IndexSetChanger.insert(Unknown Source)
at org.apache.derby.impl.sql.execute.RowChangerImpl.insertRow(Unknown
Source)
at org.apache.derby.impl.sql.execute.InsertResultSet.normalInsertCore(Unknown
Source)
at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown Source)
at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown
Source)
... 6 more
Java Result: 1
I'm running JDK 1.6.0_02-b05; on Ubuntu Linux 7.04.
Any pointers would be appreciated.
Example Code:
Table Creation:
final Connection cx = openConnection();
PreparedStatement ps = null;
try {
ps = cx.prepareStatement("create table X(X_ID bigint
generated always as identity(start with 1000),primary key(X_ID))");
ps.executeUpdate();
cx.commit();
} finally {
close(cx, ps);
}
Key Gen:
final Connection cx = openConnection();
PreparedStatement ps1 = null, ps2 = null;
ps1 = cx.prepareStatement("insert into X(X_ID) values(DEFAULT)");
try {
ps2 = cx.prepareStatement("select IDENTITY_VAL_LOCAL()
\"ID\" from X");
try {
Long xid;
for (int i = 0; i < GENERATE_X_COUNT; i++) {
try {
/* insert id */
if (1 != ps1.executeUpdate()) {
throw new RuntimeException("Could not insert.");
}
} finally {
ps1.clearParameters();
}
try {
ResultSet rs = null;
try {
/* retreive id */
rs = ps2.executeQuery();
if (rs.next()) {
xid = rs.getLong("ID");
} else {
xid = null;
}
} finally {
close(rs);
}
} finally {
ps2.clearParameters();
}
logger.debug("xid:" + xid);
}
cx.commit();
} finally {
close(ps2);
}
} finally {
close(ps1);
}
--
---------------------------------------------------------
Raymond Kroeker