# Move rows matching `where` (required: `{}` is every row) to another table (e.g. split a domain out of `log` into its own

`POST /datanotes/operations/move_rows/` (operation `move_rows`)

Move rows matching `where` (required: `{}` is every row) to another table (e.g. split a domain out of `log` into its own
table): sets each row's `table` to the destination, applies `rename` (`{"metric_distance_km":
"distance_km"}`), `set` and `drop`, adds the destination's missing dense fields, and
validates every row against the destination first. Keys unknown to the destination are
reported, never dropped silently — rename or drop them explicitly. `relocate: true` also moves
the files to the destination table's folder (named by its filename pattern); by default rows stay where
they are, as rows already in folders of their own usually do (adopt_rows, for notes that are no rows
yet, moves them by default). Refused while rows
staying behind link to a moved row through a column whose `ref` is the source table (the
conflicts name them): change those links first. Undo with
`undo_migration`.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `X-Datanotes-Actor` | header | `string` | no | JSON: on whose behalf the write is made, recorded in the journal (`harness`, `model`, `session`). |

## Request body

`application/json`, required

| Property | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `table` | `string` | yes |  |  |
| `to_table` | `string` | yes |  |  |
| `where` | `object` | yes |  | The rows to change; {} is every row of the table. |
| `rename` | `object \| null` | no | `null` |  |
| `set` | `object \| null` | no | `null` |  |
| `drop` | `string[] \| null` | no | `null` |  |
| `relocate` | `boolean` | no | `false` |  |
| `dry_run` | `boolean` | no | `false` |  |

## Responses

| Status | Description | Body |
| --- | --- | --- |
| 200 | Done. | `OpResult` (application/json) |
| 400 | Bad input: the body is not a JSON object, or an argument is unknown, missing or of the wrong type. | `Error` (application/json) |
| 401 | Missing or wrong bearer token. | `Error` (application/json) |
| 403 | A named token beyond its permissions (the engine's administration, tables outside its `write` patterns, schema changes without `ddl`). | `Error` (application/json) |
| 404 | Unknown table, view, migration, note or folder. | `Error` (application/json) |
| 409 | Ambiguous table name: it matches several tables (`paths` or `tables` lists them). | `AmbiguousName` (application/json) |
| 422 | Refused (validation failures, conflicts, an unmet `expect`): nothing written. Same body as 200, with `ok: false` and the reasons. | `OpResult` (application/json) |
| 500 | Unexpected error (`{error}`), or a write that failed partway and could not be rolled back: `rolled_back: false`, `failed` lists the files left (undo_migration on `migration_id` retries the rollback). | `OpResult \| Error` (application/json) |
| 503 | A write that failed partway (a file another program holds) and was rolled back: `rolled_back: true`, nothing written. Send it again later. Same body as 200, with `ok: false` and `failed`. | `OpResult` (application/json) |

The schemas named here are in [openapi.json](https://datanotes.dev/openapi.json) (`components.schemas`).
