diff --git a/db/post_migrate/20230704074120_replace_old_fk_p_ci_builds_metadata_to_builds.rb b/db/post_migrate/20230704074120_replace_old_fk_p_ci_builds_metadata_to_builds.rb
new file mode 100644
index 0000000000000000000000000000000000000000..49f2066d7bff14dea4128a9d9ca6831120beb60b
--- /dev/null
+++ b/db/post_migrate/20230704074120_replace_old_fk_p_ci_builds_metadata_to_builds.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkPCiBuildsMetadataToBuilds < Gitlab::Database::Migration[2.1]
+  include Gitlab::Database::PartitioningMigrationHelpers
+  include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+  disable_ddl_transaction!
+
+  def up
+    return unless should_run?
+    return if new_foreign_key_exists?
+
+    with_lock_retries do
+      remove_foreign_key_if_exists :p_ci_builds_metadata, :ci_builds,
+        name: :fk_e20479742e_p, reverse_lock_order: true
+
+      rename_constraint :p_ci_builds_metadata, :temp_fk_e20479742e_p, :fk_e20479742e_p
+
+      Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_builds_metadata) do |partition|
+        rename_constraint partition.identifier, :temp_fk_e20479742e_p, :fk_e20479742e_p
+      end
+    end
+  end
+
+  def down
+    return unless should_run?
+    return unless new_foreign_key_exists?
+
+    add_concurrent_partitioned_foreign_key :p_ci_builds_metadata, :ci_builds,
+      name: :temp_fk_e20479742e_p,
+      column: [:partition_id, :build_id],
+      target_column: [:partition_id, :id],
+      on_update: :cascade,
+      on_delete: :cascade,
+      validate: true,
+      reverse_lock_order: true
+
+    switch_constraint_names :p_ci_builds_metadata, :fk_e20479742e_p, :temp_fk_e20479742e_p
+
+    Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_builds_metadata) do |partition|
+      switch_constraint_names partition.identifier, :fk_e20479742e_p, :temp_fk_e20479742e_p
+    end
+  end
+
+  private
+
+  def should_run?
+    can_execute_on?(:ci_builds_metadata, :ci_builds)
+  end
+
+  def new_foreign_key_exists?
+    foreign_key_exists?(:p_ci_builds_metadata, :p_ci_builds, name: :fk_e20479742e_p)
+  end
+end
diff --git a/db/post_migrate/20230704074124_replace_old_fk_p_ci_runner_machine_builds_to_builds.rb b/db/post_migrate/20230704074124_replace_old_fk_p_ci_runner_machine_builds_to_builds.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b1d58058cef95d1072c31f6d55e70737040d44e0
--- /dev/null
+++ b/db/post_migrate/20230704074124_replace_old_fk_p_ci_runner_machine_builds_to_builds.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkPCiRunnerMachineBuildsToBuilds < Gitlab::Database::Migration[2.1]
+  include Gitlab::Database::PartitioningMigrationHelpers
+  include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+  disable_ddl_transaction!
+
+  def up
+    return unless should_run?
+    return if new_foreign_key_exists?
+
+    with_lock_retries do
+      remove_foreign_key_if_exists :p_ci_runner_machine_builds, :ci_builds,
+        name: :fk_bb490f12fe_p, reverse_lock_order: true
+
+      rename_constraint :p_ci_runner_machine_builds, :temp_fk_bb490f12fe_p, :fk_bb490f12fe_p
+
+      Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_runner_machine_builds) do |partition|
+        rename_constraint partition.identifier, :temp_fk_bb490f12fe_p, :fk_bb490f12fe_p
+      end
+    end
+  end
+
+  def down
+    return unless should_run?
+    return unless new_foreign_key_exists?
+
+    add_concurrent_partitioned_foreign_key :p_ci_runner_machine_builds, :ci_builds,
+      name: :temp_fk_bb490f12fe_p,
+      column: [:partition_id, :build_id],
+      target_column: [:partition_id, :id],
+      on_update: :cascade,
+      on_delete: :cascade,
+      validate: true,
+      reverse_lock_order: true
+
+    switch_constraint_names :p_ci_runner_machine_builds, :fk_bb490f12fe_p, :temp_fk_bb490f12fe_p
+
+    Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_runner_machine_builds) do |partition|
+      switch_constraint_names partition.identifier, :fk_bb490f12fe_p, :temp_fk_bb490f12fe_p
+    end
+  end
+
+  private
+
+  def should_run?
+    can_execute_on?(:ci_builds)
+  end
+
+  def new_foreign_key_exists?
+    foreign_key_exists?(:p_ci_runner_machine_builds, :p_ci_builds, name: :fk_bb490f12fe_p)
+  end
+end
diff --git a/db/schema_migrations/20230704074120 b/db/schema_migrations/20230704074120
new file mode 100644
index 0000000000000000000000000000000000000000..c411bda0d73c1b017abf531a078f02e37e83a431
--- /dev/null
+++ b/db/schema_migrations/20230704074120
@@ -0,0 +1 @@
+ec9cd530b8fe033c16865adf6494cc3e568c4bfa513e616398da737a68291cb5
\ No newline at end of file
diff --git a/db/schema_migrations/20230704074124 b/db/schema_migrations/20230704074124
new file mode 100644
index 0000000000000000000000000000000000000000..d672b7db2ef1ea39a18762b9a8d87c7b63bc7a9f
--- /dev/null
+++ b/db/schema_migrations/20230704074124
@@ -0,0 +1 @@
+d7f3642897ee44f18c2b809f3936a951c715f3021454349117e22e387d18945a
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 4eca20b3cda3731d7ea9545a5f4a87a5013895a0..1c4cd81a119386693aac061510107af24b873195 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -36059,7 +36059,7 @@ ALTER TABLE ONLY routes
     ADD CONSTRAINT fk_bb2e5b8968 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
 
 ALTER TABLE p_ci_runner_machine_builds
-    ADD CONSTRAINT fk_bb490f12fe_p FOREIGN KEY (partition_id, build_id) REFERENCES ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
+    ADD CONSTRAINT fk_bb490f12fe_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
 
 ALTER TABLE ONLY namespace_bans
     ADD CONSTRAINT fk_bcc024eef2 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -36251,7 +36251,7 @@ ALTER TABLE ONLY ci_sources_pipelines
     ADD CONSTRAINT fk_e1bad85861 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
 
 ALTER TABLE p_ci_builds_metadata
-    ADD CONSTRAINT fk_e20479742e_p FOREIGN KEY (partition_id, build_id) REFERENCES ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
+    ADD CONSTRAINT fk_e20479742e_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
 
 ALTER TABLE ONLY gitlab_subscriptions
     ADD CONSTRAINT fk_e2595d00a1 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -38143,12 +38143,6 @@ ALTER TABLE issue_search_data
 ALTER TABLE product_analytics_events_experimental
     ADD CONSTRAINT product_analytics_events_experimental_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
-ALTER TABLE p_ci_runner_machine_builds
-    ADD CONSTRAINT temp_fk_bb490f12fe_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-ALTER TABLE p_ci_builds_metadata
-    ADD CONSTRAINT temp_fk_e20479742e_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
-
 ALTER TABLE ONLY user_follow_users
     ADD CONSTRAINT user_follow_users_followee_id_fkey FOREIGN KEY (followee_id) REFERENCES users(id) ON DELETE CASCADE;