Foreign Keys

Inline (column-level)

Append ~ after column definition to declare a foreign key:

table Post {
    /// target column resolved by name
    user_id ~ User;
    /// explicit target column
    user_id ~ User(id);
    /// with ON DELETE action
    user_id ~.cascade User;
    /// named foreign key
    user_id "fk_author" ~.cascade User;
};

Foreign keys combine with other column attributes:

table Profile {
    // Primary key that also references User with cascade delete
    user_id @primary_key ~.cascade User;
};

table ClientRedirectUrl {
    // Indexed foreign key
    client_id @index ~.cascade Client;
    redirect_url: sql"TEXT";
    @primary_key(client_id, redirect_url);
};

Standalone (table-level)

For composite foreign keys or when source/target columns differ:

table AccessTokenScope {
    access_token ~.cascade AccessToken;
    audience_id ~.cascade Audience;
    scope_id;

    @primary_key(access_token, audience_id, scope_id);
    (audience_id, scope_id) ~.cascade AudienceScope;
    (authorization_code, audience_id) "aud_fk" ~.cascade AuthorizationCodeAudience;
};

ON DELETE actions

Specified with .action after ~:

Action SQL

.cascade

ON DELETE CASCADE

.restrict

ON DELETE RESTRICT

.set_null

ON DELETE SET NULL

.set_default

ON DELETE SET DEFAULT

.noop

ON DELETE NO ACTION (default if omitted)