当前位置: 首页 > 知识库问答 >
问题:

SQL JDBC java:getGeneratedKeys()在如果不存在(选择…)之后插入(…)

微生季
2023-03-14
    public long executeUpdateActionStatement(String sqlStatement, int autoGeneratedKeys) {

    ResultSet rs = null;
    Statement stmt = null;
    int rowCount = 0;
    try {
        connect();
        stmt = connect.createStatement();

        rowCount = stmt.executeUpdate(sqlStatement, autoGeneratedKeys);


        // if no new row is inserted, later I do a select to get the key
        if (rowCount < 1) 
            return -1;

        stmt.getGeneratedKeys();    /* This step throws the exception ! */
        if (rs.next()) {
            long id = rs.getLong(1);
            System.out.println(" !! ==---> ID: " + id + " | : " + sqlStatement);
            return id;
        }


    } catch (SQLFeatureNotSupportedException feature) {
        feature.printStackTrace();
        System.out.println("|| ---->>> Fehler: SQLFeatureNotSupportedException: " + sqlStatement);

    } catch (SQLServerException sqlse) {
        sqlse.printStackTrace();
        System.out.println("|| ---->>> Fehler: SQLServerException: " + sqlStatement);
    } catch (SQLException e) {
        e.printStackTrace();
        System.out.println("|| ---->>> Fehler: SQLException: " + sqlStatement);
    }

    finally {

        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    return -1;

}
    com.microsoft.sqlserver.jdbc.SQLServerException: Die Anweisung muss ausgeführt werden, bevor Ergebnisse abgerufen werden können.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getGeneratedKeys(SQLServerStatement.java:2040)
    The statement must be executed before any results can be obtained.
    executeUpdateActionStatement("IF NOT EXISTS (SELECT GeoLocationId FROM GeoLocationCoordinates WHERE Longitude = " + longitude + 
    " AND Latitude = " + latitude + ") INSERT INTO GeoLocationCoordinates VALUES (" + longitude + ", " + latitude + ")", Statement.RETURN_GENERATED_KEYS); //Statement.RETURN_GENERATED_KEYS);
    executeUpdateActionStatement("IF NOT EXISTS (SELECT PlaceId FROM Places WHERE TwitterPlaceId = \'" + p.getId() + "\') INSERT INTO Places VALUES (" + 
            placeData + ")", Statement.RETURN_GENERATED_KEYS);
    /****** Object:  Table [dbo].[GeoLocationCoordinates]    Script Date: 16.08.2013 17:55:04 **************************************************************************/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[GeoLocationCoordinates](
        [GeoLocationId] [bigint] IDENTITY(1,1) NOT NULL,
        [Longitude] [float] NOT NULL,
        [Latitude] [float] NOT NULL, CONSTRAINT [PK_GeoLocationCoordinates] PRIMARY KEY CLUSTERED (  [GeoLocationId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO
    /****** Object:  Table [dbo].[Places]    Script Date: 16.08.2013 17:57:16 **************************************************************************/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[Places](
      [PlaceId] [bigint] IDENTITY(1,1) NOT NULL,
      [TwitterPlaceId] [nvarchar](255) NULL,
      [PlaceName] [nvarchar](255) NULL,
      [PlaceFullName] [nvarchar](255) NULL,
      [StreetAdress] [nvarchar](255) NULL,
      [Country] [nvarchar](255) NULL,
      [PlaceType] [nvarchar](255) NULL,
      [PlaceUrl] [nvarchar](255) NULL,
      [BoundingBoxType] [nvarchar](255) NULL,
      [CountryTwoLetterCode] [nchar](2) NULL,
     CONSTRAINT [PK_Places] PRIMARY KEY CLUSTERED 
    (
  [PlaceId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

共有1个答案

傅增
2023-03-14
PreparedStatement stmt = connection.prepareStatement(
        "merge table_1 t1 " +
        "using (select 'testvalue' as col1) t2 " +
        " on t1.col1 = t2.col1 " +
        " when not matched by target then " + 
        " insert (col1) values('testvalue'); "  
        ,Statement.RETURN_GENERATED_KEYS);

int out = stmt.executeUpdate();
System.out.println("Return:  " + out);  
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
    System.out.println("value:  " + rs.getLong(1));
}
 类似资料:
  • 我现在正在寻找一段时间没有找到解决我的问题的方法。如果当前不存在,我想在表中插入一个新行。我需要该新条目的自动递增键或现有条目的现有键。 此外,我不清楚INSERT的返回值是什么,如果插入一列,值=1,如果行存在该怎么办?值=0或NULL或?! 如果可能的话,我不想“批量插入”,我必须在下一次插入时使用这两个返回值作为外键……或者有人知道如何使用批量插入来完成这一切吗? 感谢所有能帮忙的人!! 系

  • 问题内容: 昨天我问了这个问题:如果在mysql中插入语句并且答案很好用。问题是,如果值不存在,我需要在表中插入一行。FE 我能怎么做?在互联网上我找不到答案:( 问题答案: 我假设您的表名为tbl。 纯粹是为了方便那些要求所有SELECT语句都应该包含FROM以及可能包含其他子句的人们。MySQL可能会忽略这些子句。如果没有引用表,MySQL不需要FROM DUAL。 如其他提到的那样,如果您的

  • 问题内容: 我认为我要沿着这条路走正确的路…请忍受,因为我的SQL并不是最出色的 我试图查询数据库以从一个表中选择所有单元格中某些单元格不存在的所有内容。那没有多大意义,但我希望这段代码会 因此,基本上我有一张桌子,上面列出了员工及其详细信息。然后是另一个表,其中包含一些其他详细信息,包括其名称。在eotm_dyn表中没有名称的地方,这意味着它们没有条目,我想确切地知道它们是谁,或者换句话说,确切

  • 我有一个带有< code>ID主键(自动增量)和唯一列< code>Name的表。如果相同的< code>Name不存在,在MariaDB中有没有一种有效的方法将一行插入到这个表中,否则选择现有的行,并且在这两种情况下,返回具有这个< code>Name的行的ID? 这是Postgres的解决方案。然而,MariaDB似乎没有子句。到目前为止,我尝试的是暴力: 更新:MariaDB 10.5有子句

  • 问题内容: 我有下表: 如果给定的ID不存在,我想插入具有默认Val的ID。但是,如果它已经存在,我想增加Val的值。 我有以下代码: 并且它可以工作,但是我想用一个SQL语句来完成。我可以吗? 编辑 : 从@ Xikinho90的答案,我的最终代码是 问题答案: 您可以使用插入或替换。 我认为这可以解决问题 您只需要用输入的ID替换数字 谢谢奇科

  • 问题内容: 我有一个带有2个表的数据库,如下所示: 列是,并且是 和 在申请表中,我有2个编辑框,名称分别为和 如果用户像电子邮件一样插入一个新的负责人姓名, 那么在保存表格的过程中,我想将新的负责人姓名插入表中,请插入最后一个并将其更新为。 如果用户保持名称,但它更新电子邮件一样,然后我想在从1 =使用新的电子邮件地址和他们(其余和)保持不变。 如果负责人的名称相同,我想保留from表的原始引用