{"record":{"id":"483200096c4ecb3a","repo":"apache/iceberg","slug":"invalid-primary-key-s-a-primary-key-must-not-c","errorCode":null,"errorMessage":"Invalid primary key '%s'. A primary key must not contain duplicate columns. Found: %s","messagePattern":"Invalid primary key '(.+?)'\\. A primary key must not contain duplicate columns\\. Found: (.+?)","errorType":"validation","errorClass":"org.apache.flink.table.api.ValidationException","httpStatus":null,"severity":"error","filePath":"flink/v1.20/flink/src/main/java/org/apache/iceberg/flink/FlinkSchemaUtil.java","lineNumber":349,"sourceCode":"    return new ResolvedSchema(columns, Collections.emptyList(), uniqueConstraint);\n  }\n\n  /**\n   * Copied from\n   * org.apache.flink.table.catalog.DefaultSchemaResolver#validatePrimaryKey(org.apache.flink.table.catalog.UniqueConstraint,\n   * java.util.List)\n   */\n  private static void validatePrimaryKey(UniqueConstraint primaryKey, List<Column> columns) {\n    final Map<String, Column> columnsByNameLookup =\n        columns.stream().collect(Collectors.toMap(Column::getName, Function.identity()));\n\n    final Set<String> duplicateColumns =\n        primaryKey.getColumns().stream()\n            .filter(name -> Collections.frequency(primaryKey.getColumns(), name) > 1)\n            .collect(Collectors.toSet());\n\n    if (!duplicateColumns.isEmpty()) {\n      throw new ValidationException(\n          String.format(\n              \"Invalid primary key '%s'. A primary key must not contain duplicate columns. Found: %s\",\n              primaryKey.getName(), duplicateColumns));\n    }\n\n    for (String columnName : primaryKey.getColumns()) {\n      Column column = columnsByNameLookup.get(columnName);\n      if (column == null) {\n        throw new ValidationException(\n            String.format(\n                \"Invalid primary key '%s'. Column '%s' does not exist.\",\n                primaryKey.getName(), columnName));\n      }\n\n      if (!column.isPhysical()) {\n        throw new ValidationException(\n            String.format(\n                \"Invalid primary key '%s'. Column '%s' is not a physical column.\",","sourceCodeStart":331,"sourceCodeEnd":367,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v1.20/flink/src/main/java/org/apache/iceberg/flink/FlinkSchemaUtil.java#L331-L367","documentation":"FlinkSchemaUtil.validatePrimaryKey rejects a Flink UniqueConstraint (primary key) whose column list contains duplicates, since a key cannot repeat the same column. The duplicate names are collected and included in the ValidationException message. This occurs while converting a Flink schema/ResolvedSchema that includes a primary key.","triggerScenarios":"Defining a Flink table DDL with a PRIMARY KEY clause listing the same column twice (e.g. PRIMARY KEY (id, id) NOT ENFORCED), or building a UniqueConstraint programmatically with a duplicated column list.","commonSituations":"Generated/templated DDL that concatenates key columns without dedup; hand-written SQL typos; schema evolution tooling merging multiple key definitions.","solutions":["Remove duplicate column names from the PRIMARY KEY clause / UniqueConstraint column list.","Deduplicate keys programmatically: use a LinkedHashSet on the key columns before constructing the constraint.","Fix the code generator that emits the PRIMARY KEY so each column appears once."],"exampleFix":"// before\nPRIMARY KEY (order_id, order_id) NOT ENFORCED\n// after\nPRIMARY KEY (order_id) NOT ENFORCED","handlingStrategy":"validation","validationCode":"Set<String> seen = new HashSet<>();\nfor (String col : primaryKey.getColumns()) {\n  if (!seen.add(col)) throw new IllegalArgumentException(\"Duplicate PK column: \" + col);\n}","typeGuard":"null","tryCatchPattern":"try {\n  FlinkSchemaUtil.toResolvedSchema(schema, partitionKeys, primaryKey);\n} catch (ValidationException e) {\n  LOG.error(\"Primary key invalid: {}\", e.getMessage());\n  throw e;\n}","preventionTips":["Deduplicate PK columns with a LinkedHashSet before building UniqueConstraint.","Lint generated DDL for repeated identifiers in PRIMARY KEY clauses.","Add unit tests for schema builders that assemble keys from multiple sources."],"tags":["flink","schema","primary-key"],"backgroundTag":"schema-validation-failed","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}