Files
lancedb/docs/web/ingestion/update.mdx
T
Brendan Clement 758f738b8c docs: complete ingestion, search and integration examples (#4533)
This PR is part of the documentation revamp. Once the full set of PRs is
merged, we’ll publish the combined site to staging for review before
updating docs.lancedb.com.

Ingestion, search and integration examples are incomplete or
inconsistent across languages, and some guidance misstates SDK behavior.

This brings the guides and their example sources together. It includes
complete Python, TypeScript and Rust workflows, isolated provider and
reranker examples, the Superlinked corrections, and guidance on retries
that can duplicate writes.

Stacked on #4491. Each MDX file has one PR owner. Rebase onto main after
#4491 is squash-merged.

Local assembly, Mint validation and link checks pass. Example code is
unchanged from the previously validated package. Publication stays held
through integration.
2026-10-15 14:54:08 -07:00

124 lines
4.5 KiB
Plaintext

---
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}
<CodeGroup>
<CodeBlock filename="Python" language="python" icon="python">
{UpdateOperation}
</CodeBlock>
<CodeBlock filename="TypeScript" language="typescript" icon="square-js">
{TsUpdateOperation}
</CodeBlock>
<CodeBlock filename="Rust" language="rust" icon="rust">
{RsUpdateOperation}
</CodeBlock>
</CodeGroup>
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}
<CodeGroup>
<CodeBlock filename="Python" language="python" icon="python">
{UpdateUsingSql}
</CodeBlock>
<CodeBlock filename="TypeScript" language="typescript" icon="square-js">
{TsUpdateUsingSql}
</CodeBlock>
<CodeBlock filename="Rust" language="rust" icon="rust">
{RsUpdateUsingSql}
</CodeBlock>
</CodeGroup>
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}
<Accordion title="Complete examples: create, append, update, upsert and delete">
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.
<CodeGroup>
<CodeBlock filename="ingestion.py" language="python" icon="python">
{PyWriteWorkflow}
</CodeBlock>
<CodeBlock filename="ingestion.mts" language="typescript" icon="square-js">
{TsWriteWorkflowBody}
{TsWriteWorkflowTail}
</CodeBlock>
<CodeBlock filename="src/main.rs" language="rust" icon="rust">
{RsWriteWorkflow}
</CodeBlock>
</CodeGroup>
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.
</Accordion>