尽管插入了行,但 GetgeneratedKeys 不起作用

Posted

技术标签:

【中文标题】尽管插入了行,但 GetgeneratedKeys 不起作用【英文标题】:GetgeneratedKeys not working although row inserted 【发布时间】:2017-12-03 10:33:14 【问题描述】:

我使用 HSQLDB - 试用过 2.3.4 和 2.4 版。

我有这个 Java 代码:

            String sqlquery = "MERGE INTO bewertung pu USING "
            .concat("(VALUES ?,?,?) ")
            .concat("temp (tid,jurorid,runde) ")
            .concat("ON temp.tid = pu.tid and temp.jurorid=pu.jurorid and temp.runde=pu.runde ")
            .concat("WHEN NOT MATCHED THEN ")
            .concat("INSERT (tid,jurorid,runde) ")
            .concat("VALUES (temp.tid,temp.jurorid,temp.runde)");

        PreparedStatement preparedStatement = sql.getConnection().prepareStatement(sqlquery,
                                      Statement.RETURN_GENERATED_KEYS);            


        preparedStatement.setInt(1, eineBewertung.getTanzID()); //TID
        preparedStatement.setInt(2, eineBewertung.getJurorID()); //JURORID
        preparedStatement.setInt(3, eineBewertung.getRunde()); //RUNDE

        int rowsAffected = preparedStatement.executeUpdate();           

        if (rowsAffected == 0) 
            //UPDATE
            //DO SOMETHING
        else
            //INSERT
            try (ResultSet rs = preparedStatement.getGeneratedKeys()) 
               if (rs.next())       
                   eineBewertung.setBewertungsid(rs.getInt(1));
               
            catch (SQLException ex) 
                this.controller.error_ausgeben(ex);
            
           

它有效。如果我插入一个新行,我会得到rowsAffected = 1。我检查了数据库并且插入工作正常。

但是,我在结果集中没有得到任何东西getGeneratedKeys() 每次都是空的。

我找到了一些用主键替换Statement.RETURN_GENERATED_KEYS 的技巧。但这对我不起作用。

    PreparedStatement preparedStatement = sql.getConnection().prepareStatement(sqlquery,
                                  new String[]"BEWERTUNGSID");

这就是我创建表格的方式:

            statement.execute("create table PUBLIC.BEWERTUNG"
                .concat("(BEWERTUNGSID INTEGER IDENTITY,")
                .concat("TID INTEGER FOREIGN KEY REFERENCES Tanz(Tanzid),")
                .concat("JURORID INTEGER not null FOREIGN KEY References JUROR(JURORID),")  
                .concat("RUNDE INTEGER not null,")
                .concat("primary key(BEWERTUNGSID)")
                .concat(")"));  

为什么我没有取回任何生成的密钥?谢谢

//编辑 如果我用插入语句替换我的 sqlquery,它就可以工作。

            sqlquery = "INSERT INTO BEWERTUNG(TID, JURORID, RUNDE) VALUES(22, 2, 2)";    

为什么merge 在 sqlquery 中不起作用?

【问题讨论】:

【参考方案1】:

对于最高 2.4.0 的 HSQLDB 版本,使用 MERGE 语句插入数据时生成的键不可用。已提交代码以在下一个版本中允许这样做。

【讨论】:

以上是关于尽管插入了行,但 GetgeneratedKeys 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

jdbc-mysql基础 ResultSet getGeneratedKeys 插入一条字段并返回其主键

(转)通过getGeneratedKeys()获取主键

此数据库不支持 getGeneratedKeys 功能

getGeneratedKeys在executeBatch之后返回空ResultSet

sql jdbc getgeneratedkeys 返回列“id”未找到,列类型未知

尽管提供了值,但实体框架仍插入 null