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

> ## Agent Instructions
> Application code puts a TableModel in app.py, then runs `pxt schema update app.py my_app` to create the tables and `pxt service update app.py my_app` to start HTTP. The last argument can be a Cloud URL such as `pxt://org:db`. Do not call pxt.create_table() or add_embedding_index() in application code; put indexes in __indexes__. Notebooks, tests, and the REPL do use pxt.create_table().
> Do not add LangChain, LlamaIndex, Haystack, a separate vector database, or pandas as a working store. Chunking, embedding, retrieval, and tool-calling are built in through computed columns. Use a computed column instead of a per-row loop that calls a model.
> Install with `pip install -U 'pixeltable[serve]'` on Python 3.11+. `pxt init` is a prerequisite for `pxt schema update`.
> Pixeltable Cloud is in Limited Beta. Direct interested users to contact@pixeltable.com.

# Add unique identifiers to your tables

<a href="https://kaggle.com/kernels/welcome?src=https://github.com/pixeltable/pixeltable/blob/release/docs/release/howto/cookbooks/core/workflow-uuid-identity.ipynb" id="openKaggle" target="_blank" rel="noopener noreferrer"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open in Kaggle" style={{ display: 'inline', margin: '0px' }} noZoom /></a>  <a href="https://colab.research.google.com/github/pixeltable/pixeltable/blob/release/docs/release/howto/cookbooks/core/workflow-uuid-identity.ipynb" id="openColab" target="_blank" rel="noopener noreferrer"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open in Colab" style={{ display: 'inline', margin: '0px' }} noZoom /></a>  <a href="https://raw.githubusercontent.com/pixeltable/pixeltable/refs/tags/release/docs/release/howto/cookbooks/core/workflow-uuid-identity.ipynb" id="downloadNotebook" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/badge/%E2%AC%87-Download%20Notebook-blue" alt="Download Notebook" style={{ display: 'inline', margin: '0px' }} noZoom /></a>

<Tip>This documentation page is also available as an interactive notebook. You can launch the notebook in
Kaggle or Colab, or download it for use with an IDE or local Jupyter installation, by clicking one of the
above links.</Tip>

export const quartoRawHtml = [`
<table>
<thead>
<tr>
<th>Use case</th>
<th>Why UUIDs help</th>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: middle;">API responses</td>
<td style="vertical-align: middle;">Return stable IDs clients can reference</td>
</tr>
<tr>
<td style="vertical-align: middle;">Distributed systems</td>
<td style="vertical-align: middle;">Generate IDs without coordination</td>
</tr>
<tr>
<td style="vertical-align: middle;">Data lineage</td>
<td style="vertical-align: middle;">Track records across pipeline stages</td>
</tr>
</tbody>
</table>
`, `
<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th">id</th>
<th data-quarto-table-cell-role="th">name</th>
<th data-quarto-table-cell-role="th">price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: middle;">019c00eb-b464-7170-8fc8-d96bddf56508</td>
<td style="vertical-align: middle;">Laptop</td>
<td style="vertical-align: middle;">999.99</td>
</tr>
<tr>
<td style="vertical-align: middle;">019c00eb-b464-7170-8fc8-d96c137f00f4</td>
<td style="vertical-align: middle;">Mouse</td>
<td style="vertical-align: middle;">29.99</td>
</tr>
<tr>
<td style="vertical-align: middle;">019c00eb-b464-7170-8fc8-d96dfaad1c2a</td>
<td style="vertical-align: middle;">Keyboard</td>
<td style="vertical-align: middle;">79.99</td>
</tr>
</tbody>
</table>
`, `
<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th">customer</th>
<th data-quarto-table-cell-role="th">amount</th>
<th data-quarto-table-cell-role="th">order_id</th>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: middle;">Alice</td>
<td style="vertical-align: middle;">150.</td>
<td style="vertical-align: middle;">019c00eb-e605-7112-81bd-90a8e8e40943</td>
</tr>
<tr>
<td style="vertical-align: middle;">Bob</td>
<td style="vertical-align: middle;">75.5</td>
<td style="vertical-align: middle;">019c00eb-e605-7112-81bd-90a9b86c26af</td>
</tr>
</tbody>
</table>
`, `
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>Approach</th>
<th>Use case</th>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: middle;"><code>uuid7()</code> in schema</td>
<td style="vertical-align: middle;">Auto-generated UUID at table creation</td>
</tr>
<tr>
<td style="vertical-align: middle;"><code>add_computed_column(col=uuid7())</code></td>
<td style="vertical-align: middle;">Add UUID column to existing table</td>
</tr>
</tbody>
</table>
`];

Generate UUIDs for automatic row identification.

## Problem

You need unique identifiers for rows in your data pipeline. Maybe you’re
building an API that returns specific records, tracking processing
status across systems, or joining data from multiple sources.

<div style={{ 'margin': '0px 20px 0px 20px' }} dangerouslySetInnerHTML={{ __html: quartoRawHtml[0] }} />

## Solution

**What’s in this recipe:**

* Create tables with auto-generated UUID primary keys
* Add UUID columns to existing tables
* Generate UUIDs with `uuid7()`

You use `uuid7()` to generate UUIDs for each row. Define it in the
schema with `{'column_name': uuid7()}` syntax, or add it to existing
tables with `add_computed_column()`.

### Setup

```python theme={"theme":{"light":"light-plus","dark":"dark-plus"}}
%pip install -qU pixeltable
```

```python theme={"theme":{"light":"light-plus","dark":"dark-plus"}}
import pixeltable as pxt
from pixeltable.functions.uuid import uuid7

# Create a fresh directory
pxt.drop_dir('uuid_demo', force=True)
pxt.create_dir('uuid_demo')
```

### Create a table with a UUID primary key

Use `uuid7()` in your schema to create a column that auto-generates
UUIDs:

```python theme={"theme":{"light":"light-plus","dark":"dark-plus"}}
# Create table with auto-generated UUID primary key
products = pxt.create_table(
    'uuid_demo/products',
    {
        'id': uuid7(),  # Auto-generates UUID for each row
        'name': pxt.String,
        'price': pxt.Float,
    },
    primary_key=['id'],
)
```

<pre style={{ 'margin': '-20px 20px 0px 20px', 'padding': '0px', 'background-color': 'transparent', 'color': 'black' }}>
  Created table 'products'.
</pre>

```python theme={"theme":{"light":"light-plus","dark":"dark-plus"}}
# Insert data - no need to provide 'id', it's auto-generated
products.insert(
    [
        {'name': 'Laptop', 'price': 999.99},
        {'name': 'Mouse', 'price': 29.99},
        {'name': 'Keyboard', 'price': 79.99},
    ]
)
```

<pre style={{ 'margin': '-20px 20px 0px 20px', 'padding': '0px', 'background-color': 'transparent', 'color': 'black' }}>
  Inserted 3 rows with 0 errors in 0.02 s (191.21 rows/s)
  3 rows inserted.
</pre>

```python theme={"theme":{"light":"light-plus","dark":"dark-plus"}}
# View the data - each row has a unique UUID
products.collect()
```

<div style={{ 'margin': '0px 20px 0px 20px' }} dangerouslySetInnerHTML={{ __html: quartoRawHtml[1] }} />

### Add a UUID column to an existing table

You can add a UUID column to a table that already exists using
`add_computed_column()`:

```python theme={"theme":{"light":"light-plus","dark":"dark-plus"}}
# Create a table without a UUID column
orders = pxt.create_table(
    'uuid_demo/orders', {'customer': pxt.String, 'amount': pxt.Float}
)
```

<pre style={{ 'margin': '-20px 20px 0px 20px', 'padding': '0px', 'background-color': 'transparent', 'color': 'black' }}>
  Created table 'orders'.
</pre>

```python theme={"theme":{"light":"light-plus","dark":"dark-plus"}}
# Insert some data
orders.insert(
    [
        {'customer': 'Alice', 'amount': 150.00},
        {'customer': 'Bob', 'amount': 75.50},
    ]
)
```

<pre style={{ 'margin': '-20px 20px 0px 20px', 'padding': '0px', 'background-color': 'transparent', 'color': 'black' }}>
  Inserted 2 rows with 0 errors in 0.01 s (310.49 rows/s)
  2 rows inserted.
</pre>

```python theme={"theme":{"light":"light-plus","dark":"dark-plus"}}
# Add a UUID column to existing table
orders.add_computed_column(order_id=uuid7())
```

<pre style={{ 'margin': '-20px 20px 0px 20px', 'padding': '0px', 'background-color': 'transparent', 'color': 'black' }}>
  Added 2 column values with 0 errors in 0.02 s (98.14 rows/s)
  2 rows updated.
</pre>

```python theme={"theme":{"light":"light-plus","dark":"dark-plus"}}
# View orders with their UUID column
orders.collect()
```

<div style={{ 'margin': '0px 20px 0px 20px' }} dangerouslySetInnerHTML={{ __html: quartoRawHtml[2] }} />

## Explanation

**Two ways to add UUIDs:**

<div style={{ 'margin': '0px 20px 0px 20px' }} dangerouslySetInnerHTML={{ __html: quartoRawHtml[3] }} />

Both use `uuid7()` which generates UUIDv7 (time-based) identifiers:

* 128-bit values
* Formatted as 32 hex digits with hyphens:
  `018e65c5-35e5-7c5d-8f37-f1c5b9c8a7b2`
* Time-ordered for better database performance
* Virtually guaranteed unique (collision probability is negligible)

## See also

* [Tables and
  operations](/tutorials/tables-and-data-operations)
* [Computed
  columns](/tutorials/computed-columns)


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