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

  1. Skip the "default" entry in any workspace-deletion loop.
  2. If you meant to reset default's state, use `terraform state` subcommands or `terraform apply -destroy` instead of deleting the workspace.
  3. 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

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.