使用getGeneratedKeys()在insert上自动增加列的值 - 错误的结果

时间:2016-06-27 17:30:11

标签: sql database sqlite sql-insert resultset

当我在表中执行插入时,我正在尝试获取自动增量列的值。我正在使用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表中创建了一个条目。

1 个答案:

答案 0 :(得分:2)

SQLite使用名为“sqlite_sequence”的内部表跟踪表所拥有的最大ROWID。每当创建包含AUTOINCREMENT列的普通表时,都会自动创建并初始化sqlite_sequence表。可以使用普通的UPDATE,INSERT和DELETE语句修改sqlite_sequence表的内容。但是对此表进行修改可能会扰乱AUTOINCREMENT密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。

取自SQLite docs