IntegrityConstraintViolationException for menu links with parents that don't have a derivative id
>>> [!note] Migrated issue
<!-- Drupal.org comment -->
<!-- Migrated from issue #3202284. -->
Reported by: [feyp](https://www.drupal.org/user/998680)
>>>
<h3 id="summary-problem-motivation">Problem/Motivation</h3>
<p>Creating menu links with a parent that doesn't have a derivative plugin id will result in an integrity constraint violation for the <code>parent_uuid</code> column of <code>menu_entity_index</code> table.</p>
<h4 id="summary-steps-reproduce">Steps to reproduce</h4>
<ol>
<li>Install Drupal 9.x with standard profile and enable Menu Entity Index</li>
<li>Configure Menu Entity Index to track content entities in main menu.</li>
<li>Create a new node.</li>
<li>Create a new menu link in main menu for your node and select "Home" as parent link.</li>
</ol>
<h4>Expected result</h4>
<p>Menu link created and tracked by Menu Entity Index.</p>
<h4>Actual result</h4>
<p>White page with error messages:</p>
<p><code>Drupal\Core\Database\IntegrityConstraintViolationException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'parent_uuid' cannot be null: INSERT INTO "menu_entity_index" ("menu_name", "level", "entity_type", "entity_subtype", "entity_id", "entity_uuid", "parent_type", "parent_id", "parent_uuid", "langcode", "target_type", "target_subtype", "target_id", "target_uuid", "target_langcode") VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6, :db_insert_placeholder_7, :db_insert_placeholder_8, :db_insert_placeholder_9, :db_insert_placeholder_10, :db_insert_placeholder_11, :db_insert_placeholder_12, :db_insert_placeholder_13, :db_insert_placeholder_14); Array ( [:db_insert_placeholder_0] => main [:db_insert_placeholder_1] => 1 [:db_insert_placeholder_2] => menu_link_content [:db_insert_placeholder_3] => menu_link_content [:db_insert_placeholder_4] => 1 [:db_insert_placeholder_5] => 49c4870e-6a83-4a11-a968-f5e4556dd0e7 [:db_insert_placeholder_6] => standard.front_page [:db_insert_placeholder_7] => [:db_insert_placeholder_8] => [:db_insert_placeholder_9] => en [:db_insert_placeholder_10] => node [:db_insert_placeholder_11] => article [:db_insert_placeholder_12] => 1 [:db_insert_placeholder_13] => a4108218-0d5f-4d2c-8322-4e8bfcb66d5b [:db_insert_placeholder_14] => en ) in Drupal\Core\Database\Driver\mysql\ExceptionHandler->handleExecutionException() (line 47 of core/lib/Drupal/Core/Database/Driver/mysql/ExceptionHandler.php).</code></p>
<p><code>Drupal\Core\Entity\EntityStorageException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'parent_uuid' cannot be null: INSERT INTO "menu_entity_index" ("menu_name", "level", "entity_type", "entity_subtype", "entity_id", "entity_uuid", "parent_type", "parent_id", "parent_uuid", "langcode", "target_type", "target_subtype", "target_id", "target_uuid", "target_langcode") VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6, :db_insert_placeholder_7, :db_insert_placeholder_8, :db_insert_placeholder_9, :db_insert_placeholder_10, :db_insert_placeholder_11, :db_insert_placeholder_12, :db_insert_placeholder_13, :db_insert_placeholder_14); Array ( [:db_insert_placeholder_0] => main [:db_insert_placeholder_1] => 1 [:db_insert_placeholder_2] => menu_link_content [:db_insert_placeholder_3] => menu_link_content [:db_insert_placeholder_4] => 1 [:db_insert_placeholder_5] => 49c4870e-6a83-4a11-a968-f5e4556dd0e7 [:db_insert_placeholder_6] => standard.front_page [:db_insert_placeholder_7] => [:db_insert_placeholder_8] => [:db_insert_placeholder_9] => en [:db_insert_placeholder_10] => node [:db_insert_placeholder_11] => article [:db_insert_placeholder_12] => 1 [:db_insert_placeholder_13] => a4108218-0d5f-4d2c-8322-4e8bfcb66d5b [:db_insert_placeholder_14] => en ) in Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (line 810 of core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php).</code></p>
<h3 id="summary-proposed-resolution">Proposed resolution</h3>
<p>The <code>parent_uuid</code> column is filled with the derivative id of the parent link (<code>$parent_link->getDerivativeId()</code>), if it exists. Since this method may return <code>NULL</code>, but the database schema doesn't accept <code>null</code> values, we should cast the return value of that method to a string.</p>
issue