# Baserow Rows - Record Structure and Core Row Operations

> A Baserow row stores one table record. See how a row differs from a field and a cell, how the row ID compares to row count, and what operations rows support.

Source: https://opennix.org/en/docs/baserow/rows/overview-of-rows/


A row holds one record in a Baserow table, combining the values of every field for that entry in a single horizontal line. This article covers what a row is made of, how a row's permanent ID differs from its display count, and which row operations are available in the free, open-source edition of Baserow.

## Overview

A row represents a single record or entry in a table. Rows are the basic building blocks where your information lives, so understanding how to work with them is essential for managing data effectively in Baserow.

Rows hold the actual data records, while fields (columns) define what type of information each record contains. A row spans horizontally across the table, and a cell at the intersection of a row and a field holds one specific value.

![Row structure in a Baserow table](/images/baserow/rows/baserow-row-structure-overview.png)

In the image above, each horizontal line is a complete row carrying information about one project in the "All Projects" table.

## Rows, fields, and cells

Baserow tables organize data in a grid, where rows and fields work together to form a complete database.

**Rows (horizontal):** each row is one complete record with all of its associated information. In a customer database, for example, a single row holds the name, email, phone number, and purchase history for one customer.

**Fields (vertical):** fields define the categories of information a record contains. "Name," "Email," and "Phone" are vertical columns where the same kind of data appears for every row.

**Cells:** the intersection of a row and a field forms a cell, which holds the actual value. The cell where row 7 meets the "Name" field holds the name for that specific record.

![Example of a cell at a row-field intersection](/images/baserow/rows/baserow-row-cell-intersection.png)

## Row ID versus row count

Clicking the row-number column header toggles the display between the row ID (which can show gaps) and the row count (which never has gaps). This only changes how numbers are displayed, not the underlying data.

**Row ID** is a permanent, unique number assigned when a row is created. It never changes, even if neighboring rows are deleted or the sort order changes. After row 5 is deleted, the table shows rows 1, 2, 3, 4, 6, 7 with a gap where row 5 used to be. That permanence is what makes the ID reliable for formulas, integrations, and any lasting reference to a specific record - including the `row_id()` formula function.

**Row count** is a sequential numbering of the currently visible rows, with no gaps. The number shifts as rows are added, deleted, or filtered: deleting row 50 out of 100 renumbers everything from 1 to 99. Row count is convenient for seeing how many rows are visible or for a temporary reference, but it is not suited to permanent identification.

![Toggling between row ID and row count](/images/baserow/rows/baserow-row-id-vs-count-toggle.webp)

## What you can do with rows

- [create rows](/docs/baserow/rows/how-to-make-new-rows/) manually, by import, through a form, or via the API;
- edit a row inline in its cells or through the expanded [row detail card](/docs/baserow/rows/navigating-row-configurations/);
- select multiple rows for bulk editing, deletion, or copying - see [Paste Data into a Table](/docs/baserow/rows/paste-data-into-baserow-table/) for the details;
- delete rows - they move to the trash with a recovery window rather than disappearing instantly;
- [filter](/docs/baserow/views/filters-in-baserow/) rows by condition without deleting any data;
- sort rows by any field's value - sorting never changes a row's ID;
- [group rows](/docs/baserow/views/group-rows-in-baserow/) by a field's value into collapsible sections;
- [enlarge a row](/docs/baserow/rows/enlarging-rows/) to see more content without opening its detail card;
- review a [row's change history](/docs/baserow/rows/row-change-history/) to see who edited it and when.

## Frequently asked questions

**Is there a limit on how many rows a table can hold?** There is no hard artificial cap - Baserow uses lazy loading and fetches data progressively as you scroll, so tables can hold millions of rows. The practical limit depends on your deployment's server and database resources.

**Why can't I select more than 200 rows at once?** The 200-row selection limit exists because Baserow loads rows in batches as you scroll. This keeps scrolling smooth even in very large tables. If you need to operate on more rows, narrow the set with filters or use the API instead.

**Can a row's ID change after it is created?** No, a row ID is a permanent property that cannot be changed or reassigned. If you need your own editable numbering, add a separate field for it - an auto-number field, for example.

**What happens to an ID after its row is deleted?** A freed-up ID is never reused: even if new rows are created later, the deleted row's number stays permanently unused.

**How do I reference a row inside a formula?** Use the `row_id()` function in [formulas](/docs/baserow/formula/understanding-formulas/) to get the current row's ID. To connect data across rows and tables, combine link-to-table fields with lookup fields.

Next, read [Create Rows](/docs/baserow/rows/how-to-make-new-rows/) for every way to add a new record to a table, from the plus button to pasting from the clipboard.

