【问题标题】:Value of autoincremented column on insert using getGeneratedKeys() - wrong result使用 getGeneratedKeys() 插入时自动递增列的值 - 结果错误
【发布时间】:2016-06-27 17:30:11
【问题描述】:

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

【问题讨论】:

  • 你用什么jdbc驱动?
  • 我使用 sqlite-jdbc 驱动。我真的很沮丧,因为我真的无法按预期工作。

标签: sql database sqlite sql-insert resultset


【解决方案1】:

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

取自SQLite docs

【讨论】:

  • 好的,所以返回的可能就是这个值。了解它为什么会发生很有用!我需要弄清楚如何获取我正在寻找的列的值。我已从 Statement.RETURN_GENERATED_KEYS 更改为指定我想要从中获取值的列,但它没有帮助(请参阅代码中的编辑)
  • 有没有办法获取插入时自动赋予id的表中列的id?
  • 理论上在插入之后,要么从任务中选择 max(task_id);或从 sqlite_sequence 中选择 seq 其中 name='tasks';应该为您提供它使用的 ID 值。
猜你喜欢
  • 1970-01-01
  • 2014-09-16
  • 2020-06-18
  • 2013-04-12
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多