diff --git a/core/config/schema/core.menu.schema.yml b/core/config/schema/core.menu.schema.yml
index bf2bb195274ed2203965e4e4a44f43d6209af85f..2a28accfca39cc9d7c7033310e21918a6de1177b 100644
--- a/core/config/schema/core.menu.schema.yml
+++ b/core/config/schema/core.menu.schema.yml
@@ -1,6 +1,8 @@
 core.menu.static_menu_link_overrides:
   type: config_object
   label: 'Static menu link overrides'
+  constraints:
+    FullyValidatable: ~
   mapping:
     definitions:
       type: sequence
@@ -12,9 +14,22 @@ core.menu.static_menu_link_overrides:
           menu_name:
             type: string
             label: 'Menu name'
+            # This is the id of system.menu.* config.
+            # @see core/modules/system/config/schema/system.schema.yml
+            ConfigExists:
+              prefix: 'system.menu.'
           parent:
             type: string
             label: 'Parent'
+            # Menu link plugins specify the empty string if there is no parent. But the empty string is not a valid menu
+            # link plugin ID. In this config representation, "no parent" is therefore represented as `null`, not `''`.
+            # @see \Drupal\Core\Menu\MenuLinkInterface::getParent()
+            # @see \Drupal\Core\Menu\StaticMenuLinkOverrides::saveOverride()
+            nullable: true
+            constraints:
+              PluginExists:
+                manager: plugin.manager.menu.link
+                interface: 'Drupal\Core\Menu\MenuLinkInterface'
           weight:
             type: weight
             label: 'Weight'
diff --git a/core/lib/Drupal/Core/Menu/StaticMenuLinkOverrides.php b/core/lib/Drupal/Core/Menu/StaticMenuLinkOverrides.php
index 5172c8abed63c5ed675e118c0a101f54594987c9..15a051b0b56909b801d452a4fe01dba8eb5d32e2 100644
--- a/core/lib/Drupal/Core/Menu/StaticMenuLinkOverrides.php
+++ b/core/lib/Drupal/Core/Menu/StaticMenuLinkOverrides.php
@@ -139,7 +139,10 @@ public function saveOverride($id, array $definition) {
     if ($definition) {
       // Cast keys to avoid config schema during save.
       $definition['menu_name'] = (string) $definition['menu_name'];
-      $definition['parent'] = (string) $definition['parent'];
+      // Map `''` to `NULL`. The inverse operation is handled by the menu link manager.
+      // @see core/config/schema/core.menu.schema.yml
+      // @see \Drupal\Core\Menu\MenuLinkManager::processDefinition()
+      $definition['parent'] = empty($definition['parent']) ? NULL : (string) $definition['parent'];
       $definition['weight'] = (int) $definition['weight'];
       $definition['expanded'] = (bool) $definition['expanded'];
       $definition['enabled'] = (bool) $definition['enabled'];
diff --git a/core/modules/config/config.post_update.php b/core/modules/config/config.post_update.php
new file mode 100644
index 0000000000000000000000000000000000000000..e0689805260dd8577bb88c0bfb92f1042aa5213e
--- /dev/null
+++ b/core/modules/config/config.post_update.php
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * @file
+ * Post update functions for config.
+ */
+
+/**
+ * Fix core.menu.static_menu_link_overrides:definitions.*.parent value to null.
+ */
+function config_post_update_set_menu_parent_value_to_null(): void {
+  $config = \Drupal::configFactory()->getEditable('core.menu.static_menu_link_overrides');
+  $all_overrides = $config->get('definitions') ?: [];
+  foreach ($all_overrides as $definition_key => $definition_value) {
+    if ($definition_value['parent'] === '') {
+      $config->set('definitions.' . $definition_key . '.parent', NULL)->save();
+    }
+  }
+}
diff --git a/core/modules/config/tests/src/Functional/Update/UpdateMenuParentUpdateTest.php b/core/modules/config/tests/src/Functional/Update/UpdateMenuParentUpdateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..04c071ef895fd6222b46d56aa01af0ef1b3dc3a5
--- /dev/null
+++ b/core/modules/config/tests/src/Functional/Update/UpdateMenuParentUpdateTest.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\config\Functional\Update;
+
+use Drupal\FunctionalTests\Update\UpdatePathTestBase;
+
+/**
+ * Tests update of core.menu.static_menu_link_overrides:definitions.*.parent.
+ *
+ * @group config
+ * @covers \config_post_update_set_menu_parent_value_to_null
+ */
+class UpdateMenuParentUpdateTest extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../../../system/tests/fixtures/update/drupal-10.3.0.bare.standard.php.gz',
+    ];
+  }
+
+  /**
+   * Tests update of core.menu.static_menu_link_overrides:definitions.*.parent.
+   */
+  public function testUpdate(): void {
+    $this->assertNotNull($this->config('core.menu.static_menu_link_overrides')->get('definitions.contact__site_page.parent'));
+
+    $this->runUpdates();
+
+    $this->assertNull($this->config('core.menu.static_menu_link_overrides')->get('definitions.contact__site_page.parent'));
+  }
+
+}
diff --git a/core/profiles/demo_umami/config/install/core.menu.static_menu_link_overrides.yml b/core/profiles/demo_umami/config/install/core.menu.static_menu_link_overrides.yml
index 14af566d7fd742942dee68cf7bbde8f4067fbc01..94508a611475ae1ef1cae01eb22f5fb202a418ce 100644
--- a/core/profiles/demo_umami/config/install/core.menu.static_menu_link_overrides.yml
+++ b/core/profiles/demo_umami/config/install/core.menu.static_menu_link_overrides.yml
@@ -1,7 +1,7 @@
 definitions:
   contact__site_page:
     menu_name: footer
-    parent: ''
+    parent: null
     weight: 0
     expanded: false
     enabled: true
diff --git a/core/profiles/standard/config/install/core.menu.static_menu_link_overrides.yml b/core/profiles/standard/config/install/core.menu.static_menu_link_overrides.yml
index 14af566d7fd742942dee68cf7bbde8f4067fbc01..94508a611475ae1ef1cae01eb22f5fb202a418ce 100644
--- a/core/profiles/standard/config/install/core.menu.static_menu_link_overrides.yml
+++ b/core/profiles/standard/config/install/core.menu.static_menu_link_overrides.yml
@@ -1,7 +1,7 @@
 definitions:
   contact__site_page:
     menu_name: footer
-    parent: ''
+    parent: null
     weight: 0
     expanded: false
     enabled: true