diff --git a/db/post_migrate/20231204090310_add_unique_index_id_partition_id_to_ci_job_artifact.rb b/db/post_migrate/20231204090310_add_unique_index_id_partition_id_to_ci_job_artifact.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9d6aef69877572792ff4418882917ade90d03031
--- /dev/null
+++ b/db/post_migrate/20231204090310_add_unique_index_id_partition_id_to_ci_job_artifact.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddUniqueIndexIdPartitionIdToCiJobArtifact < Gitlab::Database::Migration[2.2]
+  milestone '16.7'
+  disable_ddl_transaction!
+  TABLE_NAME = :ci_job_artifacts
+  INDEX_NAME = :index_ci_job_artifacts_on_id_partition_id_unique
+
+  def up
+    add_concurrent_index(TABLE_NAME, %i[id partition_id], unique: true, name: INDEX_NAME)
+  end
+
+  def down
+    remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+  end
+end
diff --git a/db/post_migrate/20231204090413_add_unique_index_job_id_filte_type_partition_id_to_ci_job_artifact.rb b/db/post_migrate/20231204090413_add_unique_index_job_id_filte_type_partition_id_to_ci_job_artifact.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ad02456b1b9defccfcd92978da3de50446c9dcbb
--- /dev/null
+++ b/db/post_migrate/20231204090413_add_unique_index_job_id_filte_type_partition_id_to_ci_job_artifact.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddUniqueIndexJobIdFilteTypePartitionIdToCiJobArtifact < Gitlab::Database::Migration[2.2]
+  milestone '16.7'
+  disable_ddl_transaction!
+  TABLE_NAME = :ci_job_artifacts
+  INDEX_NAME = :idx_ci_job_artifacts_on_job_id_file_type_and_partition_id_uniq
+
+  def up
+    add_concurrent_index(TABLE_NAME, %i[job_id file_type partition_id], unique: true, name: INDEX_NAME)
+  end
+
+  def down
+    remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+  end
+end
diff --git a/db/schema_migrations/20231204090310 b/db/schema_migrations/20231204090310
new file mode 100644
index 0000000000000000000000000000000000000000..665a35d90e12da907383f2976278ac349cb46883
--- /dev/null
+++ b/db/schema_migrations/20231204090310
@@ -0,0 +1 @@
+eae9f28293f6d4de373d6f78c8c1995369ceb91cc922aa63b590c37a289523a1
\ No newline at end of file
diff --git a/db/schema_migrations/20231204090413 b/db/schema_migrations/20231204090413
new file mode 100644
index 0000000000000000000000000000000000000000..6f9dd659329d0e020728101332cb38c1c808a86f
--- /dev/null
+++ b/db/schema_migrations/20231204090413
@@ -0,0 +1 @@
+97d2e9828fd963ca329ba63970ee3c52e733555aa2a42bf444a0bc9243b1b7a1
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 82ebc8d058243a797c3f561e52a54ff84881db5b..242c3eb65b8e3217c28bb79dbb172eab5e88f3e1 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -31384,6 +31384,8 @@ CREATE INDEX idx_award_emoji_on_user_emoji_name_awardable_type_awardable_id ON a
 
 CREATE INDEX idx_build_artifacts_size_refreshes_state_updated_at ON project_build_artifacts_size_refreshes USING btree (state, updated_at);
 
+CREATE UNIQUE INDEX idx_ci_job_artifacts_on_job_id_file_type_and_partition_id_uniq ON ci_job_artifacts USING btree (job_id, file_type, partition_id);
+
 CREATE INDEX idx_ci_pipelines_artifacts_locked ON ci_pipelines USING btree (ci_ref_id, id) WHERE (locked = 1);
 
 CREATE INDEX idx_compliance_security_policies_on_policy_configuration_id ON compliance_framework_security_policies USING btree (policy_configuration_id);
@@ -32096,6 +32098,8 @@ CREATE INDEX index_ci_job_artifacts_on_file_store ON ci_job_artifacts USING btre
 
 CREATE INDEX index_ci_job_artifacts_on_file_type_for_devops_adoption ON ci_job_artifacts USING btree (file_type, project_id, created_at) WHERE (file_type = ANY (ARRAY[5, 6, 8, 23]));
 
+CREATE UNIQUE INDEX index_ci_job_artifacts_on_id_partition_id_unique ON ci_job_artifacts USING btree (id, partition_id);
+
 CREATE INDEX index_ci_job_artifacts_on_id_project_id_and_created_at ON ci_job_artifacts USING btree (project_id, created_at, id);
 
 CREATE INDEX index_ci_job_artifacts_on_id_project_id_and_file_type ON ci_job_artifacts USING btree (project_id, file_type, id);