framework/Prisma

⚠️ Prisma Referential Actions – 반드시 알아야 할 특별 규칙들

octo54 2025. 6. 17. 14:03
반응형

 

⚠️ Prisma Referential Actions – 반드시 알아야 할 특별 규칙들

“Cascade 설정했는데 왜 삭제가 안 될까?”
“SQLite에서 SetNull이 안 먹혀?”
👉 referential action이 동작하지 않거나 에러가 나는 이유, Prisma 내부 규칙을 정확히 이해하면 해결됩니다.


✅ 1. 관계에 @relation 명시 없이 동작 설정 불가

model Post {
  author   User?  // ❌ 이렇게만 하면 referential action 적용 안 됨!
}

반드시 명시적으로 작성해야 적용됩니다:

model Post {
  authorId Int?
  author   User? @relation(fields: [authorId], references: [id], onDelete: SetNull)
}

🔐 **fields + references**를 지정하지 않으면 onDelete/onUpdate 설정 자체가 무시됩니다.


✅ 2. onDelete: SetNull 사용 시 외래 키 필드가 nullable이어야 함

model Post {
  authorId Int // ❌ non-nullable이면 SetNull 설정 불가
  author   User @relation(fields: [authorId], references: [id], onDelete: SetNull)
}

수정 방법:

authorId Int? // ✅ nullable 설정 필요
author   User? @relation(fields: [authorId], references: [id], onDelete: SetNull)

✅ 3. Composite Foreign Key 사용 시, 모든 필드가 nullable이어야 SetNull 가능

반응형
model Order {
  userId   Int
  storeId  Int
  user     User @relation(fields: [userId, storeId], references: [id, storeId], onDelete: SetNull) // ❌
}

→ userId, storeId 둘 다 nullable로 바꿔야 SetNull 설정 가능


✅ 4. SQLite에서 지원 안 되는 동작 존재

  • SQLite는 onUpdate: Cascade는 지원하지만
  • onDelete: SetDefault, SetNull 등은 제대로 동작 안 할 수 있음
  • 테스트에서는 동작하지만 실제 SQLite 버전에 따라 무시될 수 있음

⚠️ 가능하면 SQLite가 아닌 PostgreSQL, MySQL 사용 권장


✅ 5. NoAction vs Restrict 차이 이해하기

옵션 동작 방식

Restrict Prisma 레벨에서 강제 차단 (트랜잭션 실행 전 거부)
NoAction 데이터베이스에 맡김 → 일부 DB에서는 삭제/업데이트 허용
@relation(fields: [authorId], references: [id], onDelete: Restrict) // 안전
@relation(fields: [authorId], references: [id], onDelete: NoAction) // DB마다 다름

✅ 6. Prisma Client에서는 참조 동작이 DB에 위임됨

await prisma.user.delete({ where: { id: 1 } })
  • onDelete: Cascade가 설정되어 있다면 → DB가 하위 엔티티도 자동 삭제
  • Prisma는 그 자체로 자식 테이블 삭제하지 않음 → DB가 실행

✅ 7. Prisma Migrate 없이 prisma db push만 사용 시 referential actions 누락 가능

  • prisma db push는 일부 DB 제약 조건을 완벽히 적용 못 할 수 있음
  • 권장 방식은 prisma migrate dev로 마이그레이션 생성하여 적용

🧠 실무 팁 정리

상황 규칙

외래키 필드에 SetNull 설정 해당 필드는 nullable이어야 함
관계에 onDelete/onUpdate 사용 @relation(fields, references) 반드시 명시
SQLite 일부 옵션 정상 작동하지 않음
복합키 관계에서 SetNull 모든 외래키가 nullable일 때만 가능
Prisma Client 삭제/변경 동작은 DB에 위임
마이그레이션 전략 migrate 방식 사용해야 완전 적용 가능

🏁 요약

키포인트 설명

@relation 명시 필수 그렇지 않으면 referential action 무효
SetNull 사용시 nullable 외래키 필드 ? 필수
SQLite 호환성 낮음 테스트 후 도입 권장
Prisma는 DB 동작에 의존 Client에서 직접 하위 삭제 X
migrate dev 사용 권장 db push는 불완전 적용 가능성

 

Prisma referential action 규칙,Prisma onDelete SetNull 오류,Prisma 관계 설정 오류,Prisma 외래키 삭제 처리,Prisma SQLite 지원 제한,Prisma 복합키 관계,Prisma db push 제약,Prisma 마이그레이션 실전팁,Prisma relation 오류 해결,Prisma onUpdate NoAction