hashicorp/terraform · error
can't delete default state
Error message
can't delete default state
What it means
Returned by Backend.DeleteWorkspace (pg/backend_state.go:48) when the requested workspace name equals backend.DefaultStateName ("default") or is empty. The default workspace is mandatory in the Postgres backend and can never be deleted; this is a deliberate guard, not a runtime fault.
Source
Thrown at internal/backend/remote-state/pg/backend_state.go:48
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
return nil, diags.Append(err)
}
result = append(result, name)
}
if err := rows.Err(); err != nil {
return nil, diags.Append(err)
}
return result, diags
}
func (b *Backend) DeleteWorkspace(name string, _ bool) tfdiags.Diagnostics {
var diags tfdiags.Diagnostics
if name == backend.DefaultStateName || name == "" {
return diags.Append(fmt.Errorf("can't delete default state"))
}
query := `DELETE FROM %s.%s WHERE name = $1`
_, err := b.db.Exec(fmt.Sprintf(query, b.schemaName, statesTableName), name)
if err != nil {
return diags.Append(err)
}
return diags
}
func (b *Backend) StateMgr(name string) (statemgr.Full, tfdiags.Diagnostics) {
var diags tfdiags.Diagnostics
// Build the state client
var stateMgr statemgr.Full = &remote.State{
Client: &RemoteClient{
Client: b.db,View on GitHub (pinned to c9def3e214)
Solutions
- Skip the "default" entry in any workspace-deletion loop.
- If you meant to reset default's state, use `terraform state` subcommands or `terraform apply -destroy` instead of deleting the workspace.
- Validate the name is non-empty and not "default" before calling DeleteWorkspace.
Example fix
// before: deletes everything returned by Workspaces()
// for _, ws := range workspaces { backend.DeleteWorkspace(ws, false) }
// after: skip the protected default
// for _, ws := range workspaces {
// if ws == "default" || ws == "" { continue }
// backend.DeleteWorkspace(ws, false)
// } Defensive patterns
Strategy: validation
Validate before calling
// Never attempt to delete the default workspace
// if name == "" || name == backend.DefaultStateName {
// return fmt.Errorf("refusing to delete protected workspace %q", name)
// }
// backend.DeleteWorkspace(name, false) Prevention
- Always filter out "default" when iterating Workspaces() for deletion.
- Treat the workspace list as partially-protected in automation.
- Validate user-supplied workspace names before calling DeleteWorkspace.
When it happens
Trigger: Calling `terraform workspace delete default`, `terraform workspace delete ""`, or invoking Backend.DeleteWorkspace("default") programmatically. Bulk-automation that iterates Workspaces() and deletes each name without skipping "default" hits this.
Common situations: A cleanup script enumerates all workspaces and deletes them, forgetting to skip default; a migration/playbook passes an empty name by mistake; tooling that treats the workspace list as fully deletable.
Related errors
AI-assisted analysis of hashicorp/terraform@c9def3e214 (2026-08-07).
Data as JSON: /api/errors/be3599803d8d81d2.
Report an issue: GitHub.