簡體   English   中英

Apache Derby ID列應自動一一遞增-但事實並非如此,為什么?

[英]Apache Derby ID column should auto increment one by one - but it does not, why?

我正在嘗試創建一個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

如Bryan所述,此錯誤是眾所周知的。 但是好事情是您可以使用以下方法解決它:

DriverManager.getConnection("jdbc:derby:;shutdown=true");

這將關閉您在derby中擁有的所有數據庫,您始終可以指定要關閉的數據庫。

DriverManager.getConnection("jdbc:derby:" + HOME_DIRECTORY + "\\\\MyDB;shutdown=true")

問題在於,無論何時注銷或關閉應用程序,我們都必須關閉derby db,然后才可以正確插入值,否則緩存值將阻止在數據庫表中插入確切的值。

請按照以下步驟操作:

con = DriverManager.getConnection(“ jdbc:derby:” +“ db” +“; create = true”);->這是用於通過提及“ db”名稱來加載derby db。此代碼必須放置在您的應用程序登錄名中行動。

DriverManager.getConnection(“ jdbc:derby:” +“ db” +“; shutdown = true”);->這是為了關閉數據庫'db'。我們必須將此代碼放置在應用程序注銷操作或關閉位置。

注意:這適用於嵌入式數據庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM