Working with One-to-One Relations

1. Defining One-to-One Relation

model User {
  id      Int      @id @default(autoincrement())
  profile Profile?
}
model Profile {
  id     Int  @id @default(autoincrement())
  bio    String
  userId Int  @unique
  user   User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
RuleDetail
Unique FK@unique on the FK side enforces 1:1
Owner sideHolds @relation and FK

2. Setting Foreign Key Field

AspectDetail
TypeMust match referenced field type
NamingrelatedModelId convention
ConstraintIndex automatically created

3. Configuring Referenced Field

OptionDetail
referencesTypically points to id
Non-PKAllowed if column is @unique

4. Using Optional One-to-One Relations

PatternEffect
Both sides optionalProfile can exist without user (set userId Int?)
Parent sideAlways optional in Prisma (profile Profile?)

5. Creating Required One-to-One Relations

await prisma.user.create({
  data: {
    email: "a@b.io",
    profile: { create: { bio: "Hello" } }
  }
});
TipDetail
Required FKMust create child in same call or supply connect

6. Setting Relation Name

WhyDetail
DisambiguationRequired when 2+ relations between same models
Syntax@relation("authoredBy", fields:[...], references:[...])

7. Using Referential Actions

ActiononDelete Behavior
CascadeDelete dependent rows
RestrictBlock delete if dependents exist
SetNullNull out FK
SetDefaultReset FK to default value
NoActionDefer to DB constraint behavior

8. Querying One-to-One Relations

const user = await prisma.user.findUnique({
  where: { id: 1 },
  include: { profile: true }
});
OperatorUse
includeEmbed related profile
selectSelectively project fields
OperationSyntax
Nested createprofile: { create: { bio } }
Connect existingprofile: { connect: { id: 5 } }
Connect-or-createprofile: { connectOrCreate: {...} }

10. Updating One-to-One Relations

await prisma.user.update({
  where: { id: 1 },
  data: {
    profile: {
      upsert: {
        create: { bio: "New" },
        update: { bio: "Updated" }
      }
    }
  }
});
ActionEffect
updateModify related record
upsertUpdate if exists else create
disconnectDetach without deletion
deleteRemove the related row