--- title: "Update rows" sidebarTitle: "Update" description: "Select existing rows, change values or expressions, and verify the changes." icon: pen availability: oss: available enterprise: available summary: >- Update rows through the SDKs in OSS and Enterprise. Enterprise also supports the SQL UPDATE statement. --- import { TsUpdateOperation, TsUpdateUsingSql, RsUpdateOperation, RsUpdateUsingSql, } from '/snippets/tables.mdx'; import { PyUpdateOperation as UpdateOperation, PyUpdateUsingSql as UpdateUsingSql, } from '/snippets/ingestion_examples.mdx'; import { PyWriteWorkflow, TsWriteWorkflowBody, TsWriteWorkflowTail, RsWriteWorkflow } from '/snippets/ingestion_examples.mdx'; Use `update` to change rows selected by a predicate. Use [merge insert](/ingestion/merge-insert) instead when matching an incoming dataset against existing keys. ## Select the rows to change {#select-rows} Check the predicate with a [filtered query](/search/filtering) before applying the update. These examples target the row with `id = 2`. Review the scope carefully when omitting a predicate, since that can update the entire table. Each example below starts from Alice with 10 logins and Bob with 20. The Python programs create and remove their own temporary database. TypeScript and Rust operation blocks use `db`; a complete program is provided below. ## Assign a new value {#update-rows} {UpdateOperation} {TsUpdateOperation} {RsUpdateOperation} The result contains Alice and **Bobby**, with their login counts unchanged. The Python `values` and TypeScript `values` arguments take literal values. Rust's `column` argument is an expression, so the string value includes SQL quotes. ## Calculate a value from the existing row {#update-rows-with-sql-expressions} {UpdateUsingSql} {TsUpdateUsingSql} {RsUpdateUsingSql} In this separate example, Bob keeps his name and his login count becomes **21**. Python's `values_sql` and TypeScript's `valuesSql` accept expressions. These SDK expressions work with embedded OSS tables; they do not require an Enterprise SQL endpoint. Enterprise also offers [`UPDATE`](/sql/dml/update). ## Verify the affected data {#verify} Read the selected rows again and inspect the changed fields. For another connection or table handle, account for its [read consistency](/tables/consistency) settings. Nested-field updates are not supported by these operations. For schema changes, see [schema evolution](/management/table#schema). Treat derived values separately: changing an input field is not a guarantee that every stored feature has been recomputed. See [Refresh a column](/feature-engineering/refresh-column). Updates can change index coverage and query cost. After a large update, inspect the workload and follow [index maintenance](/indexing/reindexing) guidance for the backend you use. ## Complete write workflow {#complete-example} Each program creates a temporary local database, performs the five operations, prints the result, and removes its temporary data when finished. - **Python:** install `lancedb`, save the code as `ingestion.py`, and run `python ingestion.py`. - **TypeScript:** install `@lancedb/lancedb`, save the code as `ingestion.mts`, and run `node ingestion.mts` with Node.js 22.18 or later. - **Rust:** download the [complete Rust project](/static/code/ingestion-rust.zip), extract it, and run `cargo run --locked`. It includes `src/main.rs`, the Cargo manifest and a lockfile for the example's dependencies. The code is shown below. {PyWriteWorkflow} {TsWriteWorkflowBody} {TsWriteWorkflowTail} {RsWriteWorkflow} After the operations, Alice has 10 logins, Bobby has 21, and Charlie has 6. Dana is selected for deletion and is absent from the final result.