From dd90a2afb5d94e0671e0aa504633c5810c6d6411 Mon Sep 17 00:00:00 2001 From: Ibrahim Ozkan <51259479+ibrahimozkn@users.noreply.github.com> Date: Sat, 25 Apr 2026 22:32:46 +0200 Subject: [PATCH] fix(db): add ON DELETE CASCADE to study FK constraints Study deletion failed with FK violation (23503) when dependent records existed in study_invite, study_subject, repo, or study_fitbit_credentials. Drop and re-add all four constraints with ON DELETE CASCADE so cascading cleanup is handled at the DB level without app-side workarounds. --- .../20260425_study_cascade_delete.sql | 24 +++++++++++++++++++ database/studyu-schema.sql | 8 +++---- 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 database/migration/20260425_study_cascade_delete.sql diff --git a/database/migration/20260425_study_cascade_delete.sql b/database/migration/20260425_study_cascade_delete.sql new file mode 100644 index 000000000..0c6333602 --- /dev/null +++ b/database/migration/20260425_study_cascade_delete.sql @@ -0,0 +1,24 @@ +-- +-- Add ON DELETE CASCADE to all FK constraints referencing study(id) +-- so that deleting a study automatically removes all dependent records. +-- + +ALTER TABLE public.repo + DROP CONSTRAINT "repo_studyId_fkey", + ADD CONSTRAINT "repo_studyId_fkey" + FOREIGN KEY (study_id) REFERENCES public.study(id) ON DELETE CASCADE; + +ALTER TABLE public.study_fitbit_credentials + DROP CONSTRAINT "study_fitbit_credentials_studyId_fkey", + ADD CONSTRAINT "study_fitbit_credentials_studyId_fkey" + FOREIGN KEY (study_id) REFERENCES public.study(id) ON DELETE CASCADE; + +ALTER TABLE public.study_invite + DROP CONSTRAINT "study_invite_studyId_fkey", + ADD CONSTRAINT "study_invite_studyId_fkey" + FOREIGN KEY (study_id) REFERENCES public.study(id) ON DELETE CASCADE; + +ALTER TABLE public.study_subject + DROP CONSTRAINT "study_subject_studyId_fkey", + ADD CONSTRAINT "study_subject_studyId_fkey" + FOREIGN KEY (study_id) REFERENCES public.study(id) ON DELETE CASCADE; diff --git a/database/studyu-schema.sql b/database/studyu-schema.sql index 3eb887cae..90612a30b 100644 --- a/database/studyu-schema.sql +++ b/database/studyu-schema.sql @@ -640,7 +640,7 @@ ALTER TABLE ONLY "public"."subject_progress" ALTER TABLE ONLY "public"."repo" - ADD CONSTRAINT "repo_studyId_fkey" FOREIGN KEY ("study_id") REFERENCES "public"."study"("id"); + ADD CONSTRAINT "repo_studyId_fkey" FOREIGN KEY ("study_id") REFERENCES "public"."study"("id") ON DELETE CASCADE; @@ -650,12 +650,12 @@ ALTER TABLE ONLY "public"."repo" ALTER TABLE ONLY "public"."study_fitbit_credentials" - ADD CONSTRAINT "study_fitbit_credentials_studyId_fkey" FOREIGN KEY ("study_id") REFERENCES "public"."study"("id"); + ADD CONSTRAINT "study_fitbit_credentials_studyId_fkey" FOREIGN KEY ("study_id") REFERENCES "public"."study"("id") ON DELETE CASCADE; ALTER TABLE ONLY "public"."study_invite" - ADD CONSTRAINT "study_invite_studyId_fkey" FOREIGN KEY ("study_id") REFERENCES "public"."study"("id"); + ADD CONSTRAINT "study_invite_studyId_fkey" FOREIGN KEY ("study_id") REFERENCES "public"."study"("id") ON DELETE CASCADE; @@ -665,7 +665,7 @@ ALTER TABLE ONLY "public"."study_subject" ALTER TABLE ONLY "public"."study_subject" - ADD CONSTRAINT "study_subject_studyId_fkey" FOREIGN KEY ("study_id") REFERENCES "public"."study"("id"); + ADD CONSTRAINT "study_subject_studyId_fkey" FOREIGN KEY ("study_id") REFERENCES "public"."study"("id") ON DELETE CASCADE;