Skip to content
Open beta — everything’s free right now, and your rate is locked when it ends.

Import into an existing table: skip, map, or create each column

The import wizard can append a file's rows to a table you already have. Each column maps to an existing field, becomes a new one, or gets skipped — and a bad value anywhere aborts with nothing written.

Updated August 2026

The import wizard has two targets: a new table, or one you already have. This page is about the second — the monthly supplier price list, the signup sheet from an event — where the table, its fields, its views and its webhooks already exist and the file needs to fold itself in.

The promise is the same in both modes: the whole file validates before anything writes. A bad value on row 40,000 means row 1 didn't land either.

Run one

  1. Open the button at the right of the table tabs → Import data…Upload a CSV or Excel file, and pick the file.
  2. Choose Add rows to an existing table and pick the table.
  3. Decide each column. Every column offers three moves:
    • Map to existing field — the values go into a field the table already has.
    • Create new field — the column becomes a new field on the table, named and typed by you.
    • Skip — the column stays in the file.
  4. Click Import N rows.

The mapping step in existing-table mode: a column being mapped to one of the Plants table's fields, with sample values on the left and the three-way action select per row.

What "map" offers, and refuses

The map list shows only fields that can take the column's values: text-like columns map onto the text family (single line, long text, email, phone, URL), number-like columns onto the number family (number, currency, percent, rating), dates onto dates, checkboxes onto checkboxes, selects onto selects. Duration fields take either — 1:30 from a text-ish column, or a bare number. A column with no plausible target reads "No matching field on this table."

What never appears: links, attachments, buttons, and computed fields (formula, lookup, rollup). A CSV cell has no record ids to resolve and computed fields have no writable column — the server refuses those targets too, with "can't be an import target — it's computed, not a plain field."

How values squeeze into existing types

Each cell is coerced to the target field's type, strictly:

  • Number: thousands separators stripped — 1,287 lands as 1287.
  • Currency: symbols stripped; a cell with no digit at all ("TBD") is refused rather than becoming zero.
  • Percent: the trailing % stripped — 15% lands as 15.
  • Checkbox: true/1/yes and false/0/no, any case.
  • Date: ISO dates as-is; 03/04/2026 obeys the per-column Read dates as control (month-first or day-first).
  • Duration: 1:30, or a bare number read in the field's own format.
  • Multi select: the cell splits on comma-space or semicolon-space — Pet-safe, Air-purifying is two choices, not one.

An empty cell writes an empty value. Nothing is guessed silently: the type doing the coercing is the one you picked on screen.

Selects grow to fit

Mapping onto a select field whose choices don't cover the file would strand rows, so missing choices are added automatically — existing choices keep their ids and colors untouched, and new ones are appended. (Airtable's importer does the same.) The ceiling is 100 distinct choices; past it the import refuses and names the count: "…has 132 distinct choices — too many for a select field. Map it to a text field instead."

When a row is bad

Nothing lands. Every cell of every row is validated before the first write, so the failure is a clean sentence naming the spot:

Row 3: "many" isn't a number, needed for field "Qty".

Fix the cell in the file and run it again — the table is exactly as it was.

Two honest edges. First, the import appends only: it cannot recognize that row 12 of the file is an update to an existing record. Updating by id is what the records API is for. Second, the one failure validation can't prevent is infrastructure — a connection dropped mid-write. Batches already committed then stay, and the error says so exactly: "…N row(s) were already added before this failure and remain in the table."

The questions people ask

Will my webhooks fire for every imported row? Mostly no. Imports write in bulk, and bulk writes of 50 records or more fire no webhooks — though a small import, or a big one's final short batch, is under that line and does. If a webhook must not see the import at all, pause it first.

Can I import twice without duplicates? Only by not importing the same rows twice. There's no key matching — every row in the file becomes a new record.

How big can the file be? A CSV or TSV has no limit — the browser reads it and streams the rows, so the only ceiling is your database's own 1,000,000 records. An Excel workbook is 20 MB and 50,000 rows per run, same as every import.

Tabla is the database we build these on.

A no-code database with real Postgres underneath: every feature on every plan, a million records per database, and your whole database back out in one file, any day.

More guides