使用 getGeneratedKeys() 插入时自动递增列的值 - 错误结果
Value of autoincremented column on insert using getGeneratedKeys() - wrong result
当我在 table 中执行插入时,我试图获取自动递增列的值。我正在使用 sqlite。这是 table:
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;
}
问题是它不是 return 我的 task_id 列的值,而是一个随着我所做的每个插入而递增的值。如果我已经完成了 9 次插入,然后将它们全部删除,下次我调用 add() 时它仍将是 return 10。即使我重新启动我的应用程序,也会发生这种情况。知道我做错了什么吗?我还有另一种方法用于另一个 table (列表),其中我有几乎完全相同的代码。当我在 add(List list) 之后调用 add(Task task) 方法时,我刚刚看到在列表 table 中创建了一个条目。
SQLite 使用名为 "sqlite_sequence" 的内部 table 跟踪 table 曾经拥有的最大 ROWID。每当创建包含 AUTOINCREMENT 列的普通 table 时,都会自动创建和初始化 sqlite_sequence table。 sqlite_sequence table 的内容可以使用普通的 UPDATE、INSERT 和 DELETE 语句进行修改。但是对此 table 进行修改可能会扰乱 AUTOINCREMENT 密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。
当我在 table 中执行插入时,我试图获取自动递增列的值。我正在使用 sqlite。这是 table:
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;
}
问题是它不是 return 我的 task_id 列的值,而是一个随着我所做的每个插入而递增的值。如果我已经完成了 9 次插入,然后将它们全部删除,下次我调用 add() 时它仍将是 return 10。即使我重新启动我的应用程序,也会发生这种情况。知道我做错了什么吗?我还有另一种方法用于另一个 table (列表),其中我有几乎完全相同的代码。当我在 add(List list) 之后调用 add(Task task) 方法时,我刚刚看到在列表 table 中创建了一个条目。
SQLite 使用名为 "sqlite_sequence" 的内部 table 跟踪 table 曾经拥有的最大 ROWID。每当创建包含 AUTOINCREMENT 列的普通 table 时,都会自动创建和初始化 sqlite_sequence table。 sqlite_sequence table 的内容可以使用普通的 UPDATE、INSERT 和 DELETE 语句进行修改。但是对此 table 进行修改可能会扰乱 AUTOINCREMENT 密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。