【问题标题】:Delete from JDBC Derby Database using the auto-generated key (INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1))使用自动生成的键从 JDBC Derby 数据库中删除(INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1))
【发布时间】: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 是否具有值 1363642 or 36253474598 无关紧要。您也不应该关心自动生成的值中的差距。一切都按预期工作,设计和记录。 ID 生成只是为了创建 unique 标识符。即使您删除“较早”的值,已创建的值也将保持唯一。

标签: java jdbc derby


【解决方案1】:

我对你在这里想要什么感到有点困惑。

您是说当您删除 1 时,您希望 ID 2 更新为使用 ID 1,因为 ID 1 已经消失?

如果是这样,那不是它的工作方式,而且效率极低且复杂。您可能有 200 个表引用该 ID = 2,它们都需要级联更新才能将其重命名为 1,这也会让 DB 使用者感到困惑。

您可以控制是否重复使用最低的可用 ID,而不是从最高的 ID 继续,但这是一个特定于数据库的问题。

【讨论】:

    猜你喜欢
    • 2023-02-19
    • 2023-03-27
    • 1970-01-01
    • 2017-10-13
    • 2013-05-09
    • 2018-02-08
    • 2021-01-08
    • 1970-01-01
    • 2019-11-07
    相关资源
    最近更新 更多