我有一个搜索数据库中最大的id并返回id + 1
的方法static int searchIdNewPlane(Connection con) {
int maxId = 1;
try {
String query = "SELECT id FROM Plane ORDER BY id DESC Limit 1 ";
PreparedStatement pst = con.prepareStatement(query);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
maxId = rs.getInt("id");
}
return maxId + 1;
} catch (Exception e) {
return 1; //error
}
}
这是解决问题的好主意吗?
答案 0 :(得分:2)
如果您正在使用mySQL或Oracle数据库,则可以使用
SELECT MAX(id) FROM Plane
这将返回(单个)最高ID,而无需限制您的查询。
答案 1 :(得分:2)
根据数据库的不同,更好的解决方案是使用序列。这种方法有一些固有的问题(不是线程安全的......)。
答案 2 :(得分:1)
使用您的数据库为您完成此操作。
SELECT MAX(id) as maxid FROM Plane
while( rs.next() )
{
maxId = rs.getInt('maxid');
}
return maxId + 1;
答案 3 :(得分:1)
我的猜测是你想要一个新的ID来插入新记录。 有几个数据库供应商有自己的机制来插入带有生成的新主键的新记录。哪个更安全/更有效率。想一想:
- A: get new MAX + 1 = 100
- B: get new MAX + 1 = 100
- B: insert with ID = 100
- A: failed insert with ID = 100
JDBC实现了一种独立于供应商的方式来执行没有主键的插入,然后检索生成的密钥。 (即使是插入多条记录,每条记录也有多个生成密钥 - 如果支持的话。)
在MySQL中说你有一个主键ID,INT和AUTOINCREMENT。
try (PreparedStatement ps = con.prepareStatement("insert into TB_classes"
+ "(CLASS_TEACHER_ID , CLASS_NAME , CLASS_YEAR , CLASS_SUBJECT) "
+ "values (? , ? , ? ,?)")) {
ps.setString(1, request.getParameter("teacher"));
ps.setString(2, request.getParameter("name1"));
ps.setString(3, request.getParameter("year"));
ps.setString(4, request.getParameter("subject"));
int updateCount = ps.executeUpdate(); // 1 expected on insert.
try (ResultSet primaryKeysRS = ps.getGeneratedKeys()) {
if (primaryKeyRS.next()) {
int id = primaryKeyRS.getInt(1);
...
}
}
}
(这里try-with-resources会自动关闭内容。)
所有这一切都有这样的优势,即同时执行此任务两次不会混淆ID,给出相同的两倍,或者等等。将它留给数据库也更有效率。