我有两种方法,一种用于将数据插入db,另一种用于删除它们。假设我添加了3行,它们分别具有id = 1,id = 2,id = 3。现在,我决定删除最后一个,然后再次插入1行。因此,我有三行ID为1,2,3的行,所以我得到了三行ID为1,2,4的行。我该如何解决?
private void insert() throws SQLException {
String query = "INSERT INTO users (username, email, password, user_group_id) VALUES (?, ?, ?, ?);";
PreparedStatement sql = Boot.getCon().prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
sql.setString(1, username);
sql.setString(2, email);
sql.setString(3, password);
sql.setInt(4,user_group_id);
sql.executeUpdate();
}
public static void delete(int id) throws SQLException {
String query = "DELETE FROM users where id=?;";
PreparedStatement statement = Boot.getCon().prepareStatement(query);
statement.setInt(1,id);
statement.executeUpdate();
System.out.println("You have deleted 1 row");
}
答案 0 :(得分:0)
首先这不是问题,这是AUTO_INCREMENT的工作方式... 如果您想修复它,那么您必须进行更多编码,如果您不懒惰和着迷,我可以告诉您一些想法。
从您的索引中删除AUTO_INCREMENT,创建一个名为ID的列,将其设置为INT类型,然后您就需要创建一个类似的函数:
private int returnLastID(){
//Make your Connection to the database things here.
String query="SELECT ID FROM table_name ORDER BY ID DESC LIMIT 1";
//prepare your statement into the resultset variable then simply return it.
return resultSet.getInt("ID");
}
就像每次插入新记录一样,只需调用此函数并对其进行+1。 希望你喜欢它。
答案 1 :(得分:0)
这似乎不是问题,这是预期的行为。您的代码很好。
我相信您在后台使用一些序列来分配ID。每次插入时,序列值都会增加1。
如果您删除任何行,则该ID将不会再次使用。
答案 2 :(得分:0)
在数据库中删除永久性文件时,请确保在身份种子中创建空白。 解决方案通常使用已删除的标志,即1 =已删除。如果您不愿意创建空白(出于合规原因),请考虑更新已删除的列,而不是硬删除。
可以使用以下查询更改身份种子:
SELECT LAST_INSERT_ID(); SET IDENTITY = 4;
身份种子是递增的,将身份种子设置为低于最大值将不起作用。