当我在表中执行插入时,我正在尝试获取自动增量列的值。我正在使用sqlite。这是表格:
CREATE TABLE `tasks` (
`task_id` INTEGER,
`task_list_id` INTEGER,
`task_name` VARCHAR(30),
`task_due_date` TIMESTAMP,
`task_created_date` TIMESTAMP,
`done` BOOLEAN,
PRIMARY KEY(task_id),
FOREIGN KEY(`task_list_id`) REFERENCES `lists`(`list_id`)
);
这是我的插入方法:
public int add(Task task) throws Exception {
PreparedStatement statement = null;
try {
String SQL = "INSERT INTO TASKS (TASK_LIST_ID, TASK_NAME, DONE, TASK_CREATED_DATE) VALUES (?, ?, ?, CURRENT_TIMESTAMP)";
statement = jdbcTemplate.getDataSource().getConnection()
.prepareStatement(SQL, new String[]{ "task_id" });
statement.setInt(1, task.getListId());
statement.setString(2, task.getTaskName());
statement.setBoolean(3, task.isDone());
statement.executeUpdate();
ResultSet generatedKeys = statement.getGeneratedKeys();
if (generatedKeys.next()) {
return (int)generatedKeys.getLong(1);
}
} catch (Exception e) {
e.printStackTrace();
throw new Exception("Failed to add Task to DB: " + task.toString());
} finally {
if (generatedKeys != null) {
generatedKeys.close();
}
if (statement != null) {
statement.close();
}
}
return -1;
}
问题是它不会返回我的task_id列的值,而是为我执行的每个插入递增的值。如果我已完成9次插入,则将它们全部删除,下次调用add()时它仍会返回10.即使重新启动应用程序,也会发生这种情况。关于我做错了什么的任何想法?我还有另一个方法用于另一个表(列表),其中我有几乎完全相同的代码。我刚刚看到在add(List list)之后调用add(Task task)方法时在lists表中创建了一个条目。
答案 0 :(得分:2)
SQLite使用名为“sqlite_sequence”的内部表跟踪表所拥有的最大ROWID。每当创建包含AUTOINCREMENT列的普通表时,都会自动创建并初始化sqlite_sequence表。可以使用普通的UPDATE,INSERT和DELETE语句修改sqlite_sequence表的内容。但是对此表进行修改可能会扰乱AUTOINCREMENT密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。