-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unable to delete Obj1 if Obj2 references it with Action: SetNull #14271
Comments
Can you share your full Prisma Schema including datasource and generator? We're wondering what your |
Hi, could you please try again with Prisma 4.1.0? We tried reproducing this issue, but we observed the proper behavior: deleting 1 Could you also please try running |
That is unfortunate. Can you maybe share the |
-- public."BatteryLevel" definition
-- Drop table
-- DROP TABLE public."BatteryLevel";
CREATE TABLE public."BatteryLevel" (
id serial4 NOT NULL,
"hubId" int4 NULL,
"createdAt" timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
volts float8 NOT NULL,
"percent" float8 NOT NULL,
CONSTRAINT "BatteryLevel_pkey" PRIMARY KEY (id)
);
-- public."BatteryLevel" foreign keys
ALTER TABLE public."BatteryLevel" ADD CONSTRAINT "BatteryLevel_hubId_fkey" FOREIGN KEY ("hubId") REFERENCES public."Hub"(id) ON DELETE SET NULL ON UPDATE CASCADE; |
I'm currently re-working on a reproduction of this issue, but the fact that no From the docs:
|
After trying to reproduce this issue with Schemagenerator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgres"
url = env("DATABASE_URL")
}
model Hub {
id Int @id @default(autoincrement())
name String
batteryLevels BatteryLevel[]
}
model BatteryLevel {
id Int @id @default(autoincrement())
hubId Int?
// recall that `onUpdate: Cascade` is implicit
hub Hub? @relation(fields: [hubId], references: [id], onDelete: SetNull)
} Reproduction// 'hub-1' has batteryLevels with ids in [1, 2]
await prisma.hub.create({
data: {
id: 1,
name: 'hub-1',
batteryLevels: {
createMany: {
data: [
{ id: 1 },
{ id: 2 },
]
}
}
},
})
// 'hub-2' has batteryLevels with ids in [3, 4]
await prisma.hub.create({
data: {
id: 2,
name: 'hub-2',
batteryLevels: {
createMany: {
data: [
{ id: 3 },
{ id: 4 },
]
}
}
},
})
// we get rid of 'hub-2'
await prisma.hub.delete({ where: { id: 2 } })
const hubs = await prisma.hub.findMany({
include: { batteryLevels: true },
orderBy: { id: 'asc' },
})
expect(hubs).toMatchObject([
id: 1,
name: 'hub-1',
batteryLevels: [ { id: 1, hubId: 1 }, { id: 2, hubId: 1 } ],
])
// the batteryLevels that were linked to 'hub-2' have `hubId: null` now
const batteryLevels = await prisma.batteryLevel.findMany({ orderBy: { id: 'asc' } })
expect(batteryLevels).toMatchObject([
{ id: 1, hubId: 1 },
{ id: 2, hubId: 1 },
{ id: 3, hubId: null },
{ id: 4, hubId: null }
]) |
After upgrading to Prisma |
Thanks for the update @baconcheese113. If anyone ever hits this issue again, please let us know via a comment here or open a new one. Thanks! |
…tabases (#14221) * test(client): prototype referential integrity tests Related: #10806 Test Suites: 1 failed, 1 total Tests: 3 failed, 45 passed, 48 total Snapshots: 0 total Time: 9.838 s * exclude mongodb to see if types tests fail like locally * wip rewrite with Alberto * chore: update tests * chore: used .rejects.toThrowError * chore: started adding ref actions * chore: mongodb only supports 'referentialIntegrity: prisma' * chore: added support for conditional error messages * wip reorg with describe revert matrix and schema changes beforeEach check and create users with profiles * fix referentialIntegrityLine * add skeleton for 1:n and m:n tests * chore: highlighted some test errors with mongodb * chore: added create tests for 1:n relationship * chore: added TODO comment * WIP m:n for SQL databases * ci: try running github actions matrix with our tests only * ci: remove needs: detect_jobs_to_run * ci: fix os matrix * ci: small CI env var tweak * ci: fix bash line * chore: added some update/delete tests for 1:n * chore: added comments to _matrix.ts * postgresql m:n all referential actions * merge main * DEFAULT, exclude Restrict from SQL Server, fix tests * add mongodb tests for m:n * chore: added some additional ref actions, added support for SQL Server * chore: fixed bug with DEFAULT not tested, added upsert test, fixed some conditional errors, found panic on SQLServer with SetDefault * reuse sql schema for mongodb 1:1 1:n * 1:1 test all referral actions for onDelete & clean * chore: improved ref actions, fixed failing tests * chore: reproduced issue #14271 * chore: split relationships in separate files * split m:n mongodb tests into its own file * add `enabled Boolean?` on 1-to-n It's a reproduction of #13766 * m:n add comments where RI=prisma - Cascade resolves instead of failing in update and create * add `published Boolean?` to MongoDB and update tests * 1:1 add `enabled Boolean?` and MongoDB update tests * add `published Boolean?` to m:n with update tests * chore: updated sql server tests * add comments to m:n [skip ci] * add a mongodb test for immutable _id * full database matrix for CI * split schemas into simple files * m to n MongoDB: change tests to match current implementation expectations * chore: add JSON support to getTestSuiteFullName * chore: moved ref integrity utils to its own folder. Added builder pattern to conditional error. Added matrix generation. Extracted self-contained utilities out of _schema.ts file. * chore: added sqlite support and referentialIntegrity=prisma snapshots to 1:1 and 1:n relations * chore: pnpm-lock * chore: removed temp folder that wasn't supposed to be committed * chore: imported right 'checkIfEmpty' util for m:n relation * clean and add sqlite on m to n * m to n add RI=Prisma messages as comments + small edits add expectation even for `toThrowError()` cases * m:n: split 1 test for prisma/foreignKeys * chore: added prisma snapshots and errors as comments in m:n relation (no MongoDB yet) * chore: added mongodb and comments to _matrix * fix: moved _referential-integrity-utils to _utils/referential-integrity to support ERR_PNPM_NO_SCRIPT Missing script: test:functional-code command * update matrix for MongoDB: add SetNull * chore: added comments to m:n * m to n: small edits for RI=prisma * test 1:1 / 1:n add expects for expected throws and fix some RI=prisma messages * chore: prettier * 1:1 handle error messages depending on RI=prisma/foreignKeys * * simplify conditionals * m to n: change expectations to match current state * chore: comment skipped test * sqlite: skip createMany in 1:n relations * chore: added missing sqlite snapshots to 1:n relation * 1:n add missing delete action variants * 1:n simplify and handle expected RI=prisma tests that should succeed * chore: added reproduction of issue #10000 * chore: updated reproduction of issue #10000 * chore: reproduce issue #12378 * 1:1 separate onUpdate: Restrict, NoAction * 1:1 fix create test from should throw to should succeed * ci: separate action test for each relation / file * ci: continue-on-error: true * fix: referential actions test params * fix ts checks * only run pnpm run test:functional:code filename * fix Cannot destructure property 'onDelete' of 'suiteConfig.referentialActions' as it is undefined. * chore: added reproduction of issue #12557 * chore: add assertions to nested child connect in 1:1 * chore: clean unused code and better describe title * test: add test about NO ACTION behavior with DEFERRABLE constraint * manually bump engines * chore: rename referentialIntegrity datasource property to relationMode * fix github actions * fix test about 14759 and RELATION_MODE env var * cleanup some reproduce-x test cases * add sqlite error snapshot * remove continue-on-error * remove outdated comments * ci: remove last continue-on-error: true * test: add `SetNull` to the matrix only for relationMode=prisma * ci: add continue-on-error: true to run all tests * fix snapshot with lowerace table name and run SQL Server * exclude SQL Server / SetNull when relationMode !== prisma * fix computeMatrix for SQL Server Restrict emulation which is not implemented * change failing tests (issue 15683) to use .failing * fix SQL Server test * test(reproductions): fix empty test name * fix relationMode = prisma SQL Server error snapshot * fix relationMode = prisma SQL Server error snapshot * fix relationMode = prisma SQL Server error snapshot * comment vitess docker image (unused) and put back timeout to 60s * test: fix snapshots for field-reference * test: fix snapshot and getTestSuiteParametersString * ignore expected type errors * add note about SetNull is not run for foreignKeys in the test suite * test: tweak comment and fix 1:1 test snapshots * Unused '@ts-expect-error' directive. * add `--relation-mode-tests-only` to unblock merge * test: skip NoAction for PostgreSQL and SQLite Related prisma/prisma-engines#3274 * fix relationMode value * fix test name + comments * cleanup matrix and move reproduce tests to issues directory * add test for referentialIntegrity="prisma" Closes #15736 * cleanup comments and misleading `toThrowError()` for expected to fail tests * chore: removed useless comment * chore: removed useless comments * fix imports for moved tests in issues directory Co-authored-by: jkomyno <skiabo97@gmail.com> Co-authored-by: Alberto Schiabel <jkomyno@users.noreply.github.com>
Bug description
When using the
Action: SetNull
referential action for a model relationship the deletion fails and throws an error about violating a foreign key constraint:When I update the set the field with the foreign key to be null ahead of the deletion it works:
How to reproduce
Action: SetNull
Cascade option for a model relationshipExpected behavior
The foreign key field should be set to null and the deletion should succeed
Prisma information
Environment & setup
Prisma Version
The text was updated successfully, but these errors were encountered: