diff --git a/models/migrations/v1_23/v303.go b/models/migrations/v1_23/v303.go
index c1e74c596a..e3ee180539 100644
--- a/models/migrations/v1_23/v303.go
+++ b/models/migrations/v1_23/v303.go
@@ -4,6 +4,8 @@
 package v1_23 //nolint
 
 import (
+	"fmt"
+
 	"code.gitea.io/gitea/models/migrations/base"
 
 	"xorm.io/xorm"
@@ -13,20 +15,26 @@ func GiteaLastDrop(x *xorm.Engine) error {
 	sess := x.NewSession()
 	defer sess.Close()
 
-	if err := base.DropTableColumns(sess, "badge", "slug"); err != nil {
-		return err
-	}
-	if err := base.DropTableColumns(sess, "oauth2_application", "skip_secondary_authorization"); err != nil {
-		return err
-	}
-	if err := base.DropTableColumns(sess, "repository", "default_wiki_branch"); err != nil {
-		return err
-	}
-	// the migration v297.go that adds everyone_access_mode exists in Gitea >= v1.22 and the column must be dropped
-	// but it does not exist in Forgejo and a failure to drop the column can be ignored
-	base.DropTableColumns(sess, "repo_unit", "everyone_access_mode")
-	if err := base.DropTableColumns(sess, "protected_branch", "can_force_push", "enable_force_push_allowlist", "force_push_allowlist_user_i_ds", "force_push_allowlist_team_i_ds", "force_push_allowlist_deploy_keys"); err != nil {
-		return err
+	for _, drop := range []struct {
+		table string
+		field string
+	}{
+		{"badge", "slug"},
+		{"oauth2_application", "skip_secondary_authorization"},
+		{"repository", "default_wiki_branch"},
+		{"repo_unit", "everyone_access_mode"},
+		{"protected_branch", "can_force_push"},
+		{"protected_branch", "enable_force_push_allowlist"},
+		{"protected_branch", "force_push_allowlist_user_i_ds"},
+		{"protected_branch", "force_push_allowlist_team_i_ds"},
+		{"protected_branch", "force_push_allowlist_deploy_keys"},
+	} {
+		if _, err := sess.Exec(fmt.Sprintf("SELECT `%s` FROM `%s` WHERE 0 = 1", drop.field, drop.table)); err != nil {
+			continue
+		}
+		if err := base.DropTableColumns(sess, drop.table, drop.field); err != nil {
+			return err
+		}
 	}
 
 	return sess.Commit()