A wrapper around dplyr::rows_update() with in_place = TRUE as the default, since DuckLake is designed for in-place modifications.
Arguments
- x
Target table (from get_ducklake_table())
- y
Data frame with updates
- by
Column(s) to match on
- copy
Whether to copy y to the same source as x (default TRUE)
- in_place
Whether to modify the table in place (default TRUE for DuckLake)
- unmatched
How to handle unmatched rows (default "ignore")
- ...
Additional arguments passed to dplyr::rows_update()
Details
Choosing how to change a table
To look up or combine data for analysis, use dplyr joins (
left_join()and friends). Joins read from the lake and build a new result; they never modify a lake table.To append, correct, or remove specific rows, use
rows_insert(),rows_update(), orrows_delete(). Each call is a single SQL statement against the existing table – no data leaves the database, and with data inlining enabled (DuckLake's default) small changes land in the catalog without creating tiny Parquet files.To update rows that exist and insert the ones that don't in one atomic statement, use
rows_upsert().For conditional merge logic or deletes driven by a staging table, use
merge_into().To change a table's shape without touching its data – add, drop, or rename columns, widen a type – use the schema evolution family (
add_table_column()and friends): metadata-only changes that rewrite nothing.For bulk transformations that touch most rows, use
replace_table(). It collects the transformed data into R and rewrites the whole table – heavier than the row operations, and it resets the row lineage that the in-place operations preserve in the change feed.
See also
Other row operations:
merge_into(),
rows_delete(),
rows_insert(),
rows_upsert()
Examples
if (FALSE) { # \dontrun{
# Update rows - in_place = TRUE by default
rows_update(
get_ducklake_table("my_table"),
data.frame(id = 1, value = "new"),
by = "id"
)
} # }
