fix: Unique constraint should account for soft deleted records (#11048)

FIXES FRMW-2878

**What**
Currently, the `one-to-one` unique constraints does not account for deleted record. This prevents from inserting a new record wth the same fk if another one is deleted.

**Caveat**
`hasOne` with FK option is meant to be a special case, for example a many to one - one to many without defining the other side of the relation. In that case we don't handle this behaviour and keep it as it is
This commit is contained in:
Adrien de Peretti
2025-01-22 08:42:06 +01:00
committed by GitHub
parent ecc8efcb04
commit da3906efa4
22 changed files with 361 additions and 217 deletions

View File

@@ -784,15 +784,6 @@
"name": "payment",
"schema": "public",
"indexes": [
{
"columnNames": [
"payment_session_id"
],
"composite": false,
"keyName": "payment_payment_session_id_unique",
"primary": false,
"unique": true
},
{
"keyName": "IDX_payment_payment_collection_id",
"columnNames": [],
@@ -802,12 +793,12 @@
"expression": "CREATE INDEX IF NOT EXISTS \"IDX_payment_payment_collection_id\" ON \"payment\" (payment_collection_id) WHERE deleted_at IS NULL"
},
{
"keyName": "IDX_payment_payment_session_id",
"keyName": "IDX_payment_payment_session_id_unique",
"columnNames": [],
"composite": false,
"primary": false,
"unique": false,
"expression": "CREATE INDEX IF NOT EXISTS \"IDX_payment_payment_session_id\" ON \"payment\" (payment_session_id) WHERE deleted_at IS NULL"
"expression": "CREATE UNIQUE INDEX IF NOT EXISTS \"IDX_payment_payment_session_id_unique\" ON \"payment\" (payment_session_id) WHERE deleted_at IS NULL"
},
{
"keyName": "IDX_payment_deleted_at",
@@ -825,6 +816,14 @@
"unique": false,
"expression": "CREATE INDEX IF NOT EXISTS \"IDX_payment_provider_id\" ON \"payment\" (provider_id) WHERE deleted_at IS NULL"
},
{
"keyName": "IDX_payment_payment_session_id",
"columnNames": [],
"composite": false,
"primary": false,
"unique": false,
"expression": "CREATE INDEX IF NOT EXISTS \"IDX_payment_payment_session_id\" ON \"payment\" (payment_session_id) WHERE deleted_at IS NULL"
},
{
"keyName": "payment_pkey",
"columnNames": [

View File

@@ -0,0 +1,19 @@
import { Migration } from "@mikro-orm/migrations"
export class Migration20250120110552 extends Migration {
async up(): Promise<void> {
this.addSql(
'alter table if exists "payment" drop constraint if exists "payment_payment_session_id_unique";'
)
this.addSql(
'CREATE UNIQUE INDEX IF NOT EXISTS "IDX_payment_payment_session_id_unique" ON "payment" (payment_session_id) WHERE deleted_at IS NULL;'
)
}
async down(): Promise<void> {
this.addSql('drop index if exists "IDX_payment_payment_session_id_unique";')
this.addSql(
'alter table if exists "payment" add constraint "payment_payment_session_id_unique" unique ("payment_session_id");'
)
}
}