# ❖ PrimaryToPrimaryKey

{% hint style="info" %}
❖ **SDV Enterprise Bundle**. This feature is available as part of the **CAG Bundle**, an optional add-on to SDV Enterprise. For more information, please visit the [CAG Bundle](https://docs.sdv.dev/sdv/explore/sdv-bundles/cag) page.
{% endhint %}

Use the **PrimaryToPrimaryKey** constraint when you have an exact 1-to-1 connection between the primary keys of two or more tables.&#x20;

{% hint style="warning" %}
***This constraint is deprecated.*** Instead of supplying a PrimaryToPrimaryKey constraint, connect primary keys in your metadata via a parent/child relationship. For more information, see the [Metadata API](https://docs.sdv.dev/sdv/concepts/metadata/metadata-api).

```json
"tables": {
    "Users": {
        "primary_key": "ID",
        ...
    },
    "Supplemental Info": {
        "primary_key": "ID",
        ...
    }
},
"relationships": [{
    "parent_table_name": "Users",
    "child_table_name": "Supplemental Info",
    "parent_primary_key": "ID",
    "child_foreign_key": "ID"
}]
```

{% endhint %}

<figure><img src="https://1967107441-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfNxEeZzl9uFiJ4Zf4BRZ%2Fuploads%2FH689Czwah3otjfVJHs7r%2Fprimary-to-primary-key_May%208%202025.png?alt=media&#x26;token=2ce50b1b-fd79-4fa7-9c99-bb5c80955c14" alt=""><figcaption><p>In this example, the table 'Users' has an exact 1-to-1 relationship with the table 'Supplemental Info'. Both tables are connected via the same primary key ID value.</p></figcaption></figure>

## Constraint API

Create a `PrimaryToPrimaryKey` constraint

**Parameters**:&#x20;

* (required) `table_names`: A list of strings, representing the table names whose primary keys are all connected. You must provide two or more table names.

```python
from sdv.cag import PrimaryToPrimaryKey

my_constraint = PrimaryToPrimaryKey(
    table_names=['Users', 'Supplemental Info'])
```

Make sure that all the tables in you provide are in your [Metadata](https://docs.sdv.dev/sdv/concepts/metadata), and have a primary key associated with them.

## Usage

Apply the constraint to any SDV synthesizer. Then fit and sample as usual.

```python
synthesizer = HSASynthesizer(metadata)
synthesizer.add_constraints([my_constraint])

synthesizer.fit(data)
synthetic_data = synthesizer.sample()
```

For more information about using predefined constraints, please see the [**Constraint-Augmented Generation tutorial**](https://colab.research.google.com/drive/1WCMQujfVKL5giULZXOPPIBoMfzR9Zj68?usp=sharing).
