Java 如何确保主键值中没有间隙,即使在删除之后也是如此?
我正在从数据库表中删除一些行。然后我想更新其他行的ID 例如,这是我的表格:Java 如何确保主键值中没有间隙,即使在删除之后也是如此?,java,android,sql,database,Java,Android,Sql,Database,我正在从数据库表中删除一些行。然后我想更新其他行的ID 例如,这是我的表格: id | name 1 | aaaa 2 | bbbb 3 | cccc 4 | dddd 现在我删除第3行。我想要一张这样的桌子: id | name 1 | aaaa 2 | bbbb 3 | dddd 但我得到这张桌子: id | name 1 | aaaa 2 | bbbb 4 | dddd 这是我的代码: Spars
id | name
1 | aaaa
2 | bbbb
3 | cccc
4 | dddd
现在我删除第3行。我想要一张这样的桌子:
id | name
1 | aaaa
2 | bbbb
3 | dddd
但我得到这张桌子:
id | name
1 | aaaa
2 | bbbb
4 | dddd
这是我的代码:
SparseBooleanArray checkedItemPositions = getListView()
.getCheckedItemPositions();
int itemCount = getListView().getCount();
int[] tab = new int[itemCount];
for (int i = itemCount - 1; i >= 0; i--) {
tab[i] = itemCount - i;
if (checkedItemPositions.get(i)) {
adapter.remove(list.get(i));
db.deleteMyPlace(new MyPlacesTable(tab[i]));
}
}
以及删除方法
public void deleteMyPlace(MyPlacesTable myPlace) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_MY_PLACES, KEY_ID + " = ?",
new String[] { String.valueOf(myPlace.getID()) });
db.close();
}
我能做什么?删除键时,需要将大于该键的所有值减少一,从而重新编号。如果这听起来很贵,那是因为它很贵。顺便说一句,您还必须重新编号对这些ID的所有引用 另一种成本较低的方法是将最后一个条目移动到已删除的条目。这减少了需要更改的条目的数量,但更新的复杂性和要更改的表的数量是相同的
通常最简单的解决方案是不更改ID,因为它们不需要花费任何东西来创建空白或新的ID。然而,重新编号它们既昂贵又棘手。为什么ID必须没有间隙?通常情况下,数据ID永远不会更改。你为什么不在代码中这样做呢?循环浏览您的项目并在其中编号。
id
列的全部目的是作为每行的唯一不可变标识符。为什么要这样做?Ommiting id如何删除该行?