我尝试将一些数据放入我的H2数据库中,但由于我是数据库中的一个菜鸟,所以一个多小时以来,它因错误而引发错误。
通常,我可以通过某种方式修复它,但是现在遇到了一个新的问题,我尝试使用
getGeneratedKeys()首先,我尝试使用AUTO_INCREMENT(1,1),但是它的功能不太正常,但不能正常使用。

我的程序抛出的异常是


  org.h2.jdbc.JdbcSQLException:Funktion“ GETGENERATEDKEYS” nicht gefunden
  找不到函数“ GETGENERATEDKEYS”; SQL语句:
  插入到logTbl值(getGeneratedKeys(),Webservice-> startThread0:Thread0)[90022-173]


我的数据库功能看起来像这样

    public void createTable(String Log) {

    try {
        Class.forName("org.h2.Driver");
    } catch (ClassNotFoundException e) {
        System.err.println("TREIBER FEHLER");
        e.printStackTrace();
    }
    Connection conn = null;
    try {
        conn = DriverManager.getConnection("jdbc:h2:~/DBtest/Logs");

        Statement stat = conn.createStatement();


        stat.execute("CREATE TABLE IF NOT EXISTS logTbl(ID INT PRIMARY KEY, LOG VARCHAR(255))");

        //stat.execute("insert into test values(1, 'Hello')");
        for (int i = 0; i < 20; i++) {
            stat.execute("insert into logTbl values( getGeneratedKeys()," + Log + ")");
        }
            stat.close();
            conn.close();

    } catch (SQLException e) {
        System.err.println("SQL FEHLER");
        e.printStackTrace();
    }
}


希望您能帮我解决错误,因为我说我是个新手,只是有一些代码示例为“ tutorial”,因为我找不到很好的教程

最佳答案

如果要自动生成主键值,则需要首先更改表的定义:

CREATE TABLE IF NOT EXISTS logTbl
(
  ID integer AUTO_INCREMENT PRIMARY KEY,
  LOG VARCHAR(255)
);


您还应该使用PreparedStatement而不是连接值。

因此,您的Java代码如下所示:

String insert = "insert into logTbl (log) values(?)";
PreparedStatement pstmt = connection.prepareStatement(insert,  Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();
ResultSet rs = pstmt.getGeneratedKeys();
long id = -1;
while (rs.next())
{
   rs.getLong(1);
}


您可能需要使用prepareStatement()的重载版本,在其中提供要返回的列。不知道哪种人可以使用H2:

prepareStatement(insert, new String[] {"ID"});




顺便说一句:varchar列的长度大约为255,没有什么“魔术”。 varchar(500)和varchar(20)or varchar(255)之间没有性能差异。您应该使用期望的长度,而不是您认为性能更好的“魔术”限制。

09-11 20:04