diff --git a/lib/gitlab/database/migrations/background_migration_helpers.rb b/lib/gitlab/database/migrations/background_migration_helpers.rb
index 4f1b490cc8f6e1247c4d0e37a9a970767da076ba..7e5c002d072466637830d64e1e6a9b2b472e59a2 100644
--- a/lib/gitlab/database/migrations/background_migration_helpers.rb
+++ b/lib/gitlab/database/migrations/background_migration_helpers.rb
@@ -42,7 +42,7 @@ module BackgroundMigrationHelpers
         #     end
         def queue_background_migration_jobs_by_range_at_intervals(model_class, job_class_name, delay_interval, batch_size: BATCH_SIZE, other_job_arguments: [], initial_delay: 0, track_jobs: false, primary_column_name: :id)
           raise "#{model_class} does not have an ID column of #{primary_column_name} to use for batch ranges" unless model_class.column_names.include?(primary_column_name.to_s)
-          raise "#{primary_column_name} is not an integer column" unless model_class.columns_hash[primary_column_name.to_s].type == :integer
+          raise "#{primary_column_name} is not an integer or string column" unless [:integer, :string].include?(model_class.columns_hash[primary_column_name.to_s].type)
 
           job_coordinator = coordinator_for_tracking_database
 
diff --git a/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb b/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
index 96dc3a0fc28c8205ef6bf72d6e7c22d73a3b20c9..e64f58073857dbd6249df6d59e67bf63801af1ad 100644
--- a/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
@@ -164,11 +164,19 @@
           end
         end
 
-        context "when the primary_column_name is not an integer" do
+        context 'when the primary_column_name is a string' do
+          it 'does not raise error' do
+            expect do
+              model.queue_background_migration_jobs_by_range_at_intervals(ContainerExpirationPolicy, 'FooJob', 10.minutes, primary_column_name: :name_regex)
+            end.not_to raise_error
+          end
+        end
+
+        context "when the primary_column_name is not an integer or a string" do
           it 'raises error' do
             expect do
               model.queue_background_migration_jobs_by_range_at_intervals(ContainerExpirationPolicy, 'FooJob', 10.minutes, primary_column_name: :enabled)
-            end.to raise_error(StandardError, /is not an integer column/)
+            end.to raise_error(StandardError, /is not an integer or string column/)
           end
         end