{"record":{"id":"9ed3a6a6dedb517d","repo":"pentaho/pentaho-kettle","slug":"no-generated-keys-while-return-generated-keys-is-active","errorCode":null,"errorMessage":"No generated keys while \"return generated keys\" is active!","messagePattern":"No generated keys while \"return generated keys\" is active!","errorType":"exception","errorClass":"KettleStepException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/tableoutput/TableOutput.java","lineNumber":321,"sourceCode":"        data.commitCounterMap.put( tableName, Integer.valueOf( 0 ) );\n        rowIsSafe = true;\n      } else {\n        rowIsSafe = false;\n      }\n\n      // See if we need to get back the keys as well...\n      if ( meta.isReturningGeneratedKeys() ) {\n        RowMetaAndData extraKeys = data.db.getGeneratedKeys( insertStatement );\n\n        if ( extraKeys.getRowMeta().size() > 0 ) {\n          // Send out the good word!\n          // Only 1 key at the moment. (should be enough for now :-)\n          generatedKey = extraKeys.getRowMeta().getInteger( extraKeys.getData(), 0 );\n        } else {\n          // we have to throw something here, else we don't know what the\n          // type is of the returned key(s) and we would violate our own rule\n          // that a hop should always contain rows of the same type.\n          throw new KettleStepException( \"No generated keys while \\\"return generated keys\\\" is active!\" );\n        }\n      }\n    } catch ( KettleDatabaseBatchException be ) {\n      errorMessage = be.toString();\n      batchProblem = true;\n      sendToErrorRow = true;\n      updateCounts = be.getUpdateCounts();\n      exceptionsList = be.getExceptionsList();\n\n      if ( getStepMeta().isDoingErrorHandling() ) {\n        data.db.clearBatch( insertStatement );\n        data.db.commit( true );\n      } else {\n        data.db.clearBatch( insertStatement );\n        data.db.rollback();\n        StringBuilder msg = new StringBuilder( \"Error batch inserting rows into table [\" + tableName + \"].\" );\n        msg.append( Const.CR );\n        msg.append( \"Errors encountered (first 10):\" ).append( Const.CR );","sourceCodeStart":303,"sourceCodeEnd":339,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/tableoutput/TableOutput.java#L303-L339","documentation":"The 'Return auto-generated key' option is enabled, but after inserting, no generated key rows were returned by the driver (extraKeys is null or contains no rows). The step must output a key to keep hop row-type consistency, so it throws instead of emitting null of unknown type.","triggerScenarios":"meta.isReturnGeneratedKeys() is true but Statement.getGeneratedKeys() yields an empty ResultSet — typically because the JDBC driver/table does not support generated keys (e.g. Oracle without config, MySQL without rewriteBatchedStatements/auto-generated PK, or table has no auto-increment column).","commonSituations":"Target table has no auto-increment/identity column; driver doesn't implement getGeneratedKeys; inserting with explicit PK values; batch mode with drivers that don't return keys per batch row.","solutions":["Ensure the target table has an auto-increment/identity primary key column.","Disable 'Return auto-generated key' in the step if you don't need the key downstream.","Use a JDBC driver version that supports getGeneratedKeys for your database.","For Oracle, configure sequence/returning-key support or use a Sequence step instead."],"exampleFix":"// before\nmeta.setReturnGeneratedKeys( true ); // table has no auto-increment column\n// after\nmeta.setReturnGeneratedKeys( false ); // or ALTER TABLE target ADD id BIGINT AUTO_INCREMENT PRIMARY KEY","handlingStrategy":"validation","validationCode":"// Ensure the target table has an auto-increment PK before enabling generated keys\nDatabaseMetaData md = connection.getMetaData();\ntry ( ResultSet cols = md.getColumns( null, null, tableName, \"id\" ) ) {\n  if ( !cols.next() ) throw new IllegalStateException(\n    \"No auto-increment 'id' column; disable 'Return generated keys'\" );\n}","typeGuard":null,"tryCatchPattern":"try { processRow(); } catch ( KettleStepException e ) {\n  if ( e.getMessage().contains( \"No generated keys\" ) ) {\n    // disable return-generated-keys or fix the table/driver\n  }\n}","preventionTips":["Only enable 'Return auto-generated key' when the table has an auto-increment/identity column","Use drivers known to implement getGeneratedKeys for your database","Test key return with a small sample load before production runs"],"tags":["kettle","table-output","generated-keys","jdbc"],"backgroundTag":"empty-result-set","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}