> ## Documentation Index
> Fetch the complete documentation index at: https://docs.noxus.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Creating Tables

> Create a table from scratch or import one from a CSV or Excel file

## Creating a new table

<Frame>
  <video autoPlay muted loop playsInline controls preload="auto" width="3800" height="2160" style={{ width: "100%", height: "auto" }}>
    <source src="https://storage.googleapis.com/noxus-docs-videos/tables/tables-create-table-v2.mp4" type="video/mp4" />
  </video>
</Frame>

<Steps>
  <Step title="Open the Tables tab">
    In the **Workshop**, open the **Tables** tab and click **Create Table**.
  </Step>

  <Step title="Name the table">
    Enter a **Name**, for example `Customers`. Names can be up to 56 characters and must be unique in the workspace.
  </Step>

  <Step title="Choose the primary key">
    Primary keys are **UUID (random)** by default. Under **Advanced**, you can change this to an **Auto-increment** integer instead. This can't be changed later.
  </Step>

  <Step title="Note the identifier">
    The **Identifier** is generated from the name. It is what you use in SQL and the API, and it never changes. You can find it in the table's **Settings** tab, under **General**.
  </Step>

  <Step title="Create the table" />
</Steps>

## Importing a table

Import a `.csv` or `.xlsx` file to create a new table or append rows to an existing one. Imports are all-or-nothing: if any value doesn't match its column type, no rows are imported.

Column types are detected from the file. Afterwards, a column can switch between Text and Number if all its values fit. Files can't be imported; upload them to a File column in the table instead.

<Frame>
  <video autoPlay muted loop playsInline controls preload="auto" width="3840" height="2120" style={{ width: "100%", height: "auto" }}>
    <source src="https://storage.googleapis.com/noxus-docs-videos/tables/tables-import-v2.mp4" type="video/mp4" />
  </video>
</Frame>

<Accordion title="How files are read">
  * **CSV**: the **Encoding** (UTF-8 or Latin-1) and **Delimiter** (comma, semicolon or tab) are detected automatically, and you can change them.
  * **Excel**: when the workbook has more than one visible sheet, pick one under **Sheet**. The first visible sheet is used by default.
  * **Header row**: You can choose which row is read as the Header row; rows above it are skipped.
  * Blank rows are skipped.
  * Values are trimmed, and empty values are stored as empty (null).
</Accordion>

<Warning>
  Files can be up to 25 MB (or 500,000 rows)
</Warning>

## Other ways to create a table

* **Genie**: ask Genie to create a table with the columns you describe. See [Tables with Genie](/platform/tables/using/genie).
* **Flow import**: importing a flow that was exported with its dependencies creates the tables it uses. See [Tables in Flows](/platform/tables/using/flows#exporting-and-importing-flows).
* **SDK**: `client.tables.create(...)`. See [Tables in the SDK](/sdk/resources/tables).
* **REST API**: [Create table](/api-reference/v1--tables/create-table) and [Import CSV](/api-reference/v1--tables/import-csv).

## Column types

Column types are set at creation or inferred on import, and can be changed later when the conversion is valid. Columns are managed in the table's **Settings** tab.

Tables can have columns of the following data types:

| Type | Stores | Accepts |
| :- | :- | :- |
| **Text** | Any text | Any value |
| **Number** | Decimal numbers | Plain numbers such as `42` or `-3.5`. |
| **Boolean** | True or false | `true`/`false`, `yes`/`no`, `1`/`0` or `t`/`f`, in any case |
| **Date & time** | A point in time | ISO 8601 dates, such as `2026-03-01` or `2026-03-01T09:30:00+01:00`. A value with no timezone is treated as UTC. |
| **File** | A file uploaded to the platform | Files cannot be imported in from `csv` or `xlsx`. They must be uploaded in the platform, or passed from a flow |
| **Reference** | A link to a row in another table | That row's `id`. Choose what happens when the linked row is deleted: block the deletion, delete this row too, or clear the link. |

Reference columns can't change type or have a default value.

### Converting column types

| Change | Allowed |
| :- | :- |
| **Text to Number** | Any time, if every value is a number. Thousands separators such as `1,234` are removed. |
| **Number to Text** | Any time |
| **Any other change** between Text, Number, Boolean, Date & time and File | Only while the table is empty. A default value is converted or cleared. |
| **To or from Reference** | Not possible |

### Built-in columns

Every table has these columns. They are set automatically, and their names are reserved, so they can't be used for your own columns.

| Column | Holds | Where it appears |
| :- | :- | :- |
| `id` | The row's primary key, a UUID or an auto-incrementing number | Hidden in the grid by default; turn it on with the toggle in **Settings** |
| `_created_at` | When the row was created | Only in SQL results, for example with `SELECT *` |
| `_last_updated_at` | When the row last changed | Only in SQL results |
| `_row_order` | The order rows were added in, used as the grid's default sort | Only in SQL results |

<Info>
  Default values for columns can be set only through the API, and only on Text, Number and Boolean columns.
</Info>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.