嵌入式Derby/Java DB中的自动增量错误
我正在开发一个在嵌入式模式下使用ApacheDerby数据库的记帐程序。我有一个带有两列的表分支:嵌入式Derby/Java DB中的自动增量错误,java,jdbc,derby,Java,Jdbc,Derby,我正在开发一个在嵌入式模式下使用ApacheDerby数据库的记帐程序。我有一个带有两列的表分支: CREATE TABLE Branch( idBranch INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), place VARCHAR(255) NOT NULL ); 当我在分支表中插入新记录时,自动递增1不能正常工作。 我得到以下结果:
CREATE TABLE Branch(
idBranch INT NOT NULL PRIMARY KEY
GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
place VARCHAR(255) NOT NULL
);
当我在分支表中插入新记录时,自动递增1不能正常工作。
我得到以下结果:
+----------+
| idBranch |
+----------+
| 1 |
| 101 |
| 201 |
| 301 |
+----------+
但结果应该是:
+----------+
| idBranch |
+----------+
| 1 |
| 2 |
| 3 |
| 4 |
+----------+
以下是我连接数据库的方式:
private static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
public static Connection createConnection() {
Connection connection = null;
try {
Class.forName(DRIVER);
connection = DriverManager.getConnection("jdbc:derby:" + DATABASE);
} catch (ClassNotFoundException ex) {
logger.log(Level.SEVERE, "JDBC Driver not loaded!", ex);
System.exit(1);
} catch (SQLException ex) {
// create the database
DerbyDB derbyDB = new DerbyDB();
connection = derbyDB.create();
}
return connection;
}
下面是在分支表中插入新记录的方法:
private static final String CREATE_QUERY = "INSERT INTO Branch(place) VALUES(?)";
public int createBranch(Branch branch) {
Connection connection = DerbyDAOFactory.createConnection();
try {
PreparedStatement statement = connection.prepareStatement(CREATE_QUERY, Statement.RETURN_GENERATED_KEYS);
statement.setString(1, branch.getPlace());
statement.execute();
ResultSet result = statement.getGeneratedKeys();
if(result.next()) {
return result.getInt(1);
}
} catch (SQLException ex) {
logger.log(Level.SEVERE, null, ex);
}
return -1;
}
为什么我会得到这个结果?您正在观察的序列是这个错误的结果: 以下文档描述了发生这种情况的原因: 总而言之。。。 生成的值是预先分配的(默认情况下一次分配100个值)。当数据库错误地关闭时,这些预先分配的值就会泄漏—它们只是被丢弃,当数据库再次启动时,分配器开始计算它停止的位置(在序列中引入一个间隙) 换句话说,这是预期的行为-为了避免这种情况,请确保以有序的方式关闭数据库:
DriverManager.getConnection("jdbc:derby:;shutdown=true")
显示您的查询
CREATE\u query
请。@Jens CREATE\u query=“插入分支(位置)值(?);