如何从Java代码创建数据库ID?
我正在手动增加数据库中的ID号,因为我无法让它自动工作。这是一个项目,如果它不能自动工作也没关系——我可以稍后尝试解决这个问题 我正在创建一个方法,用于检查resultSet中的最低可用ID号。最低值将设置为一个名为availableId的整数,用户在注册时将获得该整数 这就是我从阅读中得到的: 例如,我的数据库中有我的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
/,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在下一行中保留整数的值-我在这里找不到这样做的方法-我该怎么做呢?您的代码有点错误。这需要改变:
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的编辑,我想不出一个这样写的标题,在提交之前忘了完成。谢谢你的回复。