apache/cassandra · error · InvalidRequestException

Unknown column ' ' referenced in PRIMARY KEY for…

Error message

Unknown column '%s' referenced in PRIMARY KEY for materialized view '%s'

What it means

Every column named in the view's PRIMARY KEY must exist in the base table AND be present in the view's SELECT list. A name that is misspelled, doesn't exist, or was simply not projected is rejected here.

Solutions

  1. Fix the column name to match an existing base table column (mind case sensitivity with quoted identifiers)
  2. Add the column to the view's SELECT list and the corresponding IS NOT NULL restriction in WHERE
  3. Verify the base table schema with DESCRIBE TABLE before authoring the view

Example fix

// before
CREATE MATERIALIZED VIEW mv AS SELECT pk, ck FROM base WHERE pk IS NOT NULL AND ck IS NOT NULL PRIMARY KEY (pk, ckk);
// after
CREATE MATERIALIZED VIEW mv AS SELECT pk, ck FROM base WHERE pk IS NOT NULL AND ck IS NOT NULL PRIMARY KEY (pk, ck);
Defensive patterns

Strategy: validation

Validate before calling

for (String c : primaryKeyCols) if (!baseTableColumns.contains(c) || !selectColumns.contains(c)) throw new IllegalArgumentException("Key column not in base table or select list: " + c);

Try / catch

try { session.execute(createMvStmt); } catch (InvalidQueryException e) { if (e.getMessage().contains("Unknown column")) { /* reconcile names, add to SELECT/WHERE */ } }

Prevention

When it happens

Trigger: CREATE MATERIALIZED VIEW ... PRIMARY KEY (typo_col, ...) or PRIMARY KEY references a column not in the SELECT list.

Common situations: Typos or case mismatches in quoted identifiers; forgetting to add a PRIMARY KEY column to the AS SELECT list; referencing a renamed/nonexistent column after schema evolution.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/7256da4dd7721048. Report an issue: GitHub.

Appendix: source

Thrown at src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java:246

                       .map(table::getColumn)
                       .filter(ColumnMetadata::isStatic)
                       .findAny()
                       .ifPresent(c -> { throw ire("Cannot include static column '%s' in materialized view '%s'", c, viewName); });

        /*
         * Process PRIMARY KEY columns and CLUSTERING ORDER BY clause
         */

        if (partitionKeyColumns.isEmpty())
            throw ire("Must provide at least one partition key column for materialized view '%s'", viewName);

        HashSet<ColumnIdentifier> primaryKeyColumns = new HashSet<>();

        concat(partitionKeyColumns, clusteringColumns).forEach(name ->
        {
            ColumnMetadata column = table.getColumn(name);
            if (null == column || !selectedColumns.contains(name))
                throw ire("Unknown column '%s' referenced in PRIMARY KEY for materialized view '%s'", name, viewName);

            if (!primaryKeyColumns.add(name))
                throw ire("Duplicate column '%s' in PRIMARY KEY clause for materialized view '%s'", name, viewName);

            AbstractType<?> type = column.type;

            if (type.isMultiCell())
            {
                if (type.isCollection())
                    throw ire("Invalid non-frozen collection type '%s' for PRIMARY KEY column '%s'", type, name);
                else
                    throw ire("Invalid non-frozen user-defined type '%s' for PRIMARY KEY column '%s'", type, name);
            }

            if (type.isCounter())
                throw ire("counter type is not supported for PRIMARY KEY column '%s'", name);

            if (type.referencesDuration())

View on GitHub (pinned to 88fd0f6a0e)