From db9e8f3f5db4324ef46cc408bb3c4d2aeef8aaec Mon Sep 17 00:00:00 2001 From: Arkadiy Kukarkin Date: Fri, 5 Dec 2025 14:07:06 +0100 Subject: [PATCH] hotfix: avoid re-scanning known valid FKs --- model/migrate.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/model/migrate.go b/model/migrate.go index 36eda3f0..be5621c0 100644 --- a/model/migrate.go +++ b/model/migrate.go @@ -160,12 +160,14 @@ func migrateFKConstraints(db *gorm.DB) error { // Drop and recreate with SET NULL if dialect == "postgres" { // Postgres DDL is transactional - wrap DROP+ADD so failure rolls back both + // Use NOT VALID to skip row validation - existing rows were valid under CASCADE, + // so they're still valid under SET NULL. err = db.Transaction(func(tx *gorm.DB) error { if err := tx.Exec(`ALTER TABLE ` + fk.table + ` DROP CONSTRAINT ` + fk.constraint).Error; err != nil { return err } return tx.Exec(`ALTER TABLE ` + fk.table + ` ADD CONSTRAINT ` + fk.constraint + - ` FOREIGN KEY (` + fk.column + `) REFERENCES ` + fk.refTable + `(id) ON DELETE SET NULL`).Error + ` FOREIGN KEY (` + fk.column + `) REFERENCES ` + fk.refTable + `(id) ON DELETE SET NULL NOT VALID`).Error }) if err != nil { return errors.Wrapf(err, "failed to migrate constraint %s", fk.constraint)