remix-run/remix · error · Error
Table " " primaryKey must contain at least one column
Error message
Table "{tableName}" primaryKey must contain at least one column What it means
An explicitly provided primaryKey option must list at least one column. This error is thrown when primaryKey is an empty array (or equivalent), which would leave the table with no primary key at all.
Solutions
- Provide at least one column name in the primaryKey array
- Guard dynamic key lists: fall back to ['id'] when the computed list is empty
- Check for accidental spreads like { ...defaults, primaryKey: [] }
Example fix
// before
createTable('t', cols, { primaryKey: computedKeys })
// after
createTable('t', cols, { primaryKey: computedKeys.length > 0 ? computedKeys : ['id'] }) Defensive patterns
Strategy: validation
Validate before calling
if (keys.length === 0) throw new Error('primaryKey must not be empty') Prevention
- Guard dynamically computed key lists with a non-empty fallback
- Never spread option objects that may set primaryKey to []
When it happens
Trigger: Passing primaryKey: [] programmatically, e.g. when a list of key columns is computed from config or user input and comes back empty.
Common situations: Dynamic schema generation where the key list is derived from data that is empty in some environment; spread defaults that accidentally override a real key list.
Related errors
- Table " " must include an "id" column or an explicit…
- Table " " primaryKey column " " does not exist
- Composite primary keys require an object value
- create( ) requires primary key values for table "' +…
- Invalid column " " for table " ". Expected a column(...)…
AI-assisted analysis of remix-run/remix@9696913134 (2026-08-27).
Data as JSON: /api/errors/a420f380da62c377.
Report an issue: GitHub.
Appendix: source
Thrown at packages/data-table/src/lib/table.ts:1104
function normalizePrimaryKey(
tableName: string,
columns: TableColumnsDefinition,
primaryKey?: string | readonly string[],
): string[] {
if (primaryKey === undefined) {
if (!Object.prototype.hasOwnProperty.call(columns, 'id')) {
throw new Error(
'Table "' + tableName + '" must include an "id" column or an explicit primaryKey',
)
}
return ['id']
}
let keys = Array.isArray(primaryKey) ? [...primaryKey] : [primaryKey]
if (keys.length === 0) {
throw new Error('Table "' + tableName + '" primaryKey must contain at least one column')
}
for (let key of keys) {
if (!Object.prototype.hasOwnProperty.call(columns, key)) {
throw new Error('Table "' + tableName + '" primaryKey column "' + key + '" does not exist')
}
}
return keys
}
function normalizeKeySelector<table extends AnyTable>(
table: table,
selector: KeySelector<table> | undefined,
optionName: string,
defaultValue: readonly string[],
): string[] {
return normalizeKeysForTable(table, selector, optionName, defaultValue)View on GitHub (pinned to 9696913134)