# Update existing records from a file

> Change many records at once from a spreadsheet: each row finds its record, a dry run lists every change, then you apply.

Source: https://www.speclatch.com/guide/import-export/update-existing-records
Who: Admin or Engineering. Plan: Every plan.
Last verified: 2026-11-11

Use this when new values arrive for records you already have: a price list, revised lead times, corrected dimensions. Typing them into dozens of records invites slips. An update import finds each row's record, lists every value it would change, old and new, and writes nothing until you apply.

This guide applies a price sheet to a pump table: a list price and a lead time for each model number.

## How rows find their records

Each row names its record in one column, the one you choose under *Match on*: *Model #*, *SKU* or *Name*. Capitals don't matter. Three rules then keep the update safe:

- Blank cells change nothing. Map the match column and the columns you are changing, and leave the rest out, so a half-filled sheet can't wipe a value.
- Only Draft records take changes, because a value that was reviewed shouldn't change without a new review. A row whose record is In review or Published becomes an error.
- A row that matches no record is skipped, unless you choose to create it.

## Before you start

- You need the Admin or Engineering role.
- Your file is .xlsx or .csv, with a column that names each record, such as the model number.
- The records you will change are drafts. To change a published record, return it to draft first, as in [Send a record for review, approve, publish](/guide/confidentiality-review/review-and-publish).

## Map the columns

1. On **Tables**, click **Import data**.
2. Pick the table in *Import into*.
3. Click **Choose spreadsheet…** and pick your file.
4. Select **Update existing records**.
5. Under *Match on*, keep *Model #*. Under *Unmatched rows*, keep *are skipped*.
6. Under *Import as*, check that each column maps to the field it changes. A header such as `List price (USD)` finds the field *List price (USD)* by its name.

![The Map columns step with Update existing records selected, Match on Model #, Unmatched rows are skipped, and three columns mapped to Model Number, List price (USD) and Lead time (weeks).](https://www.speclatch.com/guide/import-export/update-existing-records-1.png)

*An update maps the match column and the columns that change, nothing else.*

## Check the dry run, then apply

1. Click **Dry run (validate only)**. Nothing is written yet.
2. Read each row's state. An *Update* row lists its changes under *Details*, old value → new value, where `∅` means the field was empty.
3. Read why each *Error* or *Skipped* row was left out, then fix the file or the mapping and run the dry run again.
4. Click **Apply**, which counts the rows to update, then confirm.

![A dry-run report: one Update row giving a draft pump a list price and a lead time, one Error row for a pump in review, and one Skipped row for a model number with no record.](https://www.speclatch.com/guide/import-export/update-existing-records-2.png)

*The draft pump gets its price; the pump in review is locked, and the unknown model number is skipped.*

Numbers in *Details* are in each field's own unit, the unit the value is stored in.

> **Rows that should become new records.** To create records from rows that match nothing, choose *become new drafts* under *Unmatched rows*. Then map a column to *Name*, because a new record needs one.

> **Tip:** If the same sheet comes back every month, click **Save profile**. The profile keeps the mapping, the update choice and the match column, and **Apply profile…** sets them all next time.

## What happens after

The records stay drafts, now with the new values, and their calculated fields recompute. Each record's history names the file the values came from. When the records are ready, send them for review.
