【发布时间】:2014-08-18 17:17:50
【问题描述】:
只是想知道我在这里做错了什么以及如何解决它。我有一个这样创建的简单表:
String createTableSQL = (
"CREATE TABLE ITEM_OBJECT_TABLE ("
+ "ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),"
+ "Item_Object blob)");
PreparedStatement ps = connection.prepareStatement(createTableSQL);
ps.execute();
该表存储一个“项目”对象的 blob
无论如何。我的删除方法是这样的:
public void deleteItem(int i)
{
Debug.write("Attempting to delete item ID: "+i);
try
{
PreparedStatement deleteStatement = databaseConnector.prepareStatement("DELETE FROM Item_Object_Table WHERE ID=?");
deleteStatement.setInt(1, i);
deleteStatement.execute();
} catch (SQLException ex)
{
Logger.getLogger(DatabaseControl.class.getName()).log(Level.SEVERE, null, ex);
}
}
这确实删除了该项目,但它不会更新整数 ID 不是总是生成的空等。
例如,如果我的数据库看起来像这样:
编号 1 |斑点数据 编号 2 |斑点数据我调用了 deleteItem(int ID) 方法并在 int 1 中解析(即删除 ID 1),数据库将如下所示:
编号 2 |斑点数据问题基本上是,我如何“更新”密钥?
【问题讨论】:
-
您完全误解了(生成的)主键的工作方式。这种主键的值没有任何意义。 PK 是否具有值
1、3636、42 or36253474598 无关紧要。您也不应该关心自动生成的值中的差距。一切都按预期工作,设计和记录。 ID 生成只是为了创建 unique 标识符。即使您删除“较早”的值,已创建的值也将保持唯一。