如何从Java代码创建数据库ID?

如何从Java代码创建数据库ID?,java,oracle,resultset,javadb,Java,Oracle,Resultset,Javadb,我正在手动增加数据库中的ID号,因为我无法让它自动工作。这是一个项目,如果它不能自动工作也没关系——我可以稍后尝试解决这个问题 我正在创建一个方法,用于检查resultSet中的最低可用ID号。最低值将设置为一个名为availableId的整数,用户在注册时将获得该整数 这就是我从阅读中得到的: 例如,我的数据库中有我的ID: /,2,/,4,5,6,/,8,9 1、3和7丢失,因为这些用户删除了他们的帐户。例如,我想先填写数字1,然后再填写其他用户,然后下一个用户将注册为数字3 publ

我正在手动增加数据库中的ID号,因为我无法让它自动工作。这是一个项目,如果它不能自动工作也没关系——我可以稍后尝试解决这个问题

我正在创建一个方法,用于检查resultSet中的最低可用ID号。最低值将设置为一个名为availableId的整数,用户在注册时将获得该整数

这就是我从阅读中得到的:

例如,我的数据库中有我的ID:

/,2,/,4,5,6,/,8,9
1、3和7丢失,因为这些用户删除了他们的帐户。例如,我想先填写数字1,然后再填写其他用户,然后下一个用户将注册为数字3

public int getAvailableId() {
    int availableId = 1;
    try {
        String stmt = "select PID from APP.PERSON";
        PreparedStatement ps = Main.getPreparedStatement(stmt);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            int n = rs.getInt(1);
            int n2 = rs.next().getInt(1);

            if (!(n == 1)) {
                return availableId;
            } else if (!(n2-- == n)) {
                availableId = n++;
            }
        }
        rs.close();
        ps.close();
    } catch (Exception e) {
        System.out.println(e);
    }
    return availableId;
}
这里有两个问题:

  • rs.next()
    返回一个布尔值,但我希望n2在下一行中保留整数的值-我在这里找不到这样做的方法-
  • 我不知道如何通过循环查找所有内容来找到尽可能低的免费id号
  • 请原谅这个垃圾代码!我在学习的过程中学到了很多,我明白这对一个人和两个人来说都是不好的做法,代码并不好


    我该怎么做呢?

    您的代码有点错误。这需要改变:

    rs.next().getInt(1);
    
    只是:

    rs.getInt("PID");
    
    rs.next()
    做两件事。如果存在下一行,则返回true,然后将结果集光标移动到下一行

    当没有下一行时,它将返回false,从而中断循环

    调用
    getInt
    时,它将尝试从当前行检索int。如您所见,循环条件中的
    rs.next()
    每次都会将其移动到下一行


    在这种情况下,您还需要声明

    int n
    在循环之外

    然后在每个循环迭代结束时分配
    n=n2

    大概是这样的:

        int n = 0;
        while (rs.next()) {
    
            int n2 = rs.getInt(1);
    
            if (!(n == 1)) {
                return availableId;
            } else if (!(n2-- == n)) {
                availableId = n++;
            }
    
            n = n2;
        }
    
    你可能需要玩弄它,让它做你想要的



    我的最后一点意见是,不要费心尝试获取尽可能低的免费id号,只要使用SQL MAX()或其他方法从数据库中获取最高的id号,然后添加1。

    如果确实要这样做,请确保使用事务以避免双重id(假设两个程序同时查找下一个id,然后使用相同的id)。无论如何,这是非常糟糕的做法,在我所能想到的所有RDBMS中,自动增加ID都很容易,更好地解决这个问题(并可能就此提出问题),将为您现在和维护软件时节省很多麻烦。另外,请注意,“从APP.PERSON选择PID”并不能保证和订购。如果必须,请使用:“从APP.PERSON ORDER BY PID中选择PID”。大多数情况下,我发现尝试重用已删除的ID是一个坏主意。谢谢你对Jens Erat的编辑,我想不出一个这样写的标题,在提交之前忘了完成。谢谢你的回复。