diff --git a/db/post_migrate/20250306093201_validate_project_namespace_id_null_constraint.rb b/db/post_migrate/20250306093201_validate_project_namespace_id_null_constraint.rb
new file mode 100644
index 0000000000000000000000000000000000000000..027bef41ac79523424c434e424b63f499e7517d6
--- /dev/null
+++ b/db/post_migrate/20250306093201_validate_project_namespace_id_null_constraint.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class ValidateProjectNamespaceIdNullConstraint < Gitlab::Database::Migration[2.2]
+  milestone '17.10'
+
+  def up
+    validate_not_null_constraint :projects, :project_namespace_id
+  end
+
+  def down
+    # no-op
+  end
+end
diff --git a/db/schema_migrations/20250306093201 b/db/schema_migrations/20250306093201
new file mode 100644
index 0000000000000000000000000000000000000000..8d4d566f29a294357667c22c8b422f38c7955405
--- /dev/null
+++ b/db/schema_migrations/20250306093201
@@ -0,0 +1 @@
+4b6d59e21058ca28b551da5aab555d4dc362b8faa06482a2f036698a4ccc1163
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 1af36437ceb7b9f9769129816c8bb4d6f66aac6d..463e5cb1304c84f7e4c67f29cace59e91bcdd126 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -297,7 +297,8 @@ CREATE TABLE projects (
     project_namespace_id bigint,
     hidden boolean DEFAULT false NOT NULL,
     organization_id bigint,
-    CONSTRAINT check_1a6f946a8a CHECK ((organization_id IS NOT NULL))
+    CONSTRAINT check_1a6f946a8a CHECK ((organization_id IS NOT NULL)),
+    CONSTRAINT check_fa75869cb1 CHECK ((project_namespace_id IS NOT NULL))
 );
 
 CREATE FUNCTION find_projects_by_id(projects_id bigint) RETURNS projects
@@ -27594,9 +27595,6 @@ ALTER TABLE sprints
 ALTER TABLE web_hook_logs
     ADD CONSTRAINT check_df72cb58f5 CHECK ((char_length(url_hash) <= 44)) NOT VALID;
 
-ALTER TABLE projects
-    ADD CONSTRAINT check_fa75869cb1 CHECK ((project_namespace_id IS NOT NULL)) NOT VALID;
-
 ALTER TABLE ONLY ci_build_needs
     ADD CONSTRAINT ci_build_needs_pkey PRIMARY KEY (id);