티스토리 뷰
반응형
⚠️ 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
'framework > Prisma' 카테고리의 다른 글
🧯 Prisma 관계(Relation) 에러 완전 해결 가이드 – 실무 트러블슈팅 모음 (0) | 2025.06.23 |
---|---|
✅ Prisma Referential Actions 완전 가이드 – onDelete, onUpdate 사용법 (0) | 2025.06.13 |
✅ Prisma Self-Relation 완전 가이드 – 자기 참조 관계 설정 방법 (0) | 2025.06.11 |
✅ Prisma N:M 관계 완벽 가이드 – 암시적 vs 명시적 Many-to-Many 모델링 (0) | 2025.06.10 |
✅ Prisma 1:N 관계 완전 가이드 – One-to-Many 관계 정석 모델링 (0) | 2025.06.09 |
※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- SEO최적화
- 백엔드개발
- llm
- SEO 최적화
- fastapi
- JAX
- NestJS
- AI챗봇
- Python
- gatsbyjs
- nodejs
- 프론트엔드
- Docker
- Ktor
- CI/CD
- 웹개발
- kotlin
- REACT
- rag
- Prisma
- Next.js
- 딥러닝
- 프론트엔드면접
- seo 최적화 10개
- flax
- App Router
- nextJS
- 개발블로그
- 파이썬알고리즘
- PostgreSQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함
반응형