当前位置: 首页 > 面试题库 >

Apache Derby ID列应自动一一递增-但事实并非如此,为什么?

濮宇定
2023-03-14
问题内容

我正在尝试创建一个Apache Derby-Table,并通过JDBC接口在其中插入数据。

这是我的实现的简短摘录:

public class SQLDatabase {

    private Connection connection = null;
    public final static String HOME_DIRECTORY = System.getProperty("user.home");
    public final static String TABLE_NAME = "PORPHYRIE";

    public SQLDatabase() {

        setConnection();
        if (!(isTableExisting(TABLE_NAME))) {

            createTable();
        }

    }




    // OTHER

    public void createTable() {
        String statement = "CREATE TABLE PORPHYRIE("
                + "ID int NOT NULL GENERATED ALWAYS AS IDENTITY"
                + "(START WITH 1,INCREMENT BY 1)," + "ENTRYDATE DATE NOT NULL,"
                + "DRUGTYPE varchar(255) NOT NULL,"
                + "UPPERLIMIT DOUBLE NOT NULL," + "NORMOSANG BOOLEAN NOT NULL,"
                + "MENSTRUATION BOOLEAN NOT NULL,"
                + "DRUGAMOUNT_MG DOUBLE NOT NULL,"
                + "DRUGAMOUNT_ML DOUBLE NOT NULL,"
                + "AMPOULE_NUMBERS DOUBLE NOT NULL,"
                + "RECORDDATE DATE NOT NULL," + "PRIMARY KEY(ID)" + ")";
        updateStatement(statement);
    }

    public void dropTable() {
        String statement = "DROP TABLE PORPHYRIE";
        updateStatement(statement);
    }

    public void addData(EntryPoint entry) {
        DrugAmount drugAmount = entry.getDrugAmountObject();
        SimpleDateFormat form = new SimpleDateFormat("dd.MM.yyyy");
        String statement = "INSERT INTO PORPHYRIE (ENTRYDATE,DRUGTYPE,UPPERLIMIT,NORMOSANG,MENSTRUATION,DRUGAMOUNT_MG,DRUGAMOUNT_ML,AMPOULE_NUMBERS,RECORDDATE)"
                + " values('"
                + form.format(entry.getEntryDate().getTime())
                + "','"
                + entry.DRUG_TYPE_DOLANTIN
                + "',"
                + entry.DRUG_UPPER_LIMIT
                + ","
                + entry.getNormoSang()
                + ","
                + entry.getMenstruation()
                + ","
                + drugAmount.getAmpoulesInMG()
                + ","
                + drugAmount.getAmpoulesInML()
                + ","
                + drugAmount.getNumberOfAmpoules() + ",CURRENT_DATE)";
        System.out.println("Add data!");
        updateStatement(statement);
    }


   private void setConnection() {
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            connection = DriverManager.getConnection("jdbc:derby:"
                    + HOME_DIRECTORY + "\\MyDB;create=true");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
    private void updateStatement(String statementString) {
        try {
            PreparedStatement preparedStatement = getConnection()
                    .prepareStatement(statementString);
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

这是我得到的:

在此处输入图片说明

ID列在这里有什么问题?

第一次创建SQL-
Database对象时,应创建表,该表工作正常。然后,您应该可以通过addData()方法插入一些数据,这看起来也不错。但是,如果您创建一个新的SQL数据库对象并在其中使用addData-
method(),则它将添加数据(上图中的第5行),但不会正确自动递增。怎么了


问题答案:

生成的序列号中的空白是Derby的正确且有据可查的行为。

参见例如https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html

并且:https :
//issues.apache.org/jira/browse/DERBY-5151



 类似资料:
  • 我有一个对象列表: 每一个都包含一个Object2列表。我试图遍历objList,以便从每个Object1各自的Object2列表中删除Object2的特定实例: 这会引发错误:“集合已修改;枚举操作可能无法执行。” 我不明白的是,我正在从Object2List中删除一个对象,它没有被枚举。为什么会抛出此错误?

  • 问题内容: 我使用的是与开源Parse Server集成在一起的PostgreSQL 9.5 X64。我的表具有以下结构。 由于使用了Parse Server,因此是主键。它由Parse Server自动生成。该不是主键。我想在创建新记录时自动增加1。如何在创建表中实现? 问题答案: 您可以尝试制作专栏文章。我不知道是否可以更改当前列以使其为串行,因此我们可能必须删除该列,然后将其添加回去,如下所

  • 我目前正在从事一个由主服务器和许多客户端组成的Laravel4项目。客户端创建数据并将其发送到主服务器。为了避免冲突,我使用UUIDV4作为主键。 但是,一旦在服务器上创建了数据,我希望分配一个唯一的自动递增整数,以便用户更容易识别数据。例如:用户不必谈论而可以谈论 为了保持应用程序的可管理性,我正在使用迁移,此表的当前迁移如下所示: 问题是,Laravel在定义自动增量时自动创建主键,因此迁移最

  • 问题内容: 提前谢谢您的帮助。非常感谢。 在经过两个多小时的检查后,由于得到“过程或函数指定了太多参数”的原因,其他Google结果出现了问题,但我没有找到有用的帮助。这样做的原因是,到处都可以看到我指定的参数过多,参数名称不正确或类型错误。这些都不符合我的情况。这是我的代码: 这是C#方面的内容: 问题答案: 改成这个然后告诉我错误是否消失了… 此外,当您从代码执行查询时,请在服务器上运行跟踪:

  • 问题内容: 我的架构看起来像这样: 我已经在同一数据库中创建了counters集合,并添加了一个带有’entityId’的_id的页面。从这里我不确定如何使用猫鼬来更新该页面并获取递增编号。 没有计数器的架构,我希望它保持这种状态,因为这实际上不是应用程序使用的实体。仅应在模式中使用它来自动递增字段。 问题答案: 这是一个示例,如何在Mongoose中实现自动增量字段:

  • 我正在使用PHP和MySQL。 将新行插入到具有自动递增 id 列的表中。 在插入此新行时,我想将新插入行的自动递增 id # 复制到同一行/条目中的另一列中。 创建时,新条目/行应具有自动递增的 id 列和具有相同编号的另一列。 我最大的担忧: 我需要所有这些都正确可靠地发生,即使来自其他连接的其他事务可能正在服务器上发生。 我对last_insert_id()知之甚少...我害怕能够可靠地使用