diff --git a/core/lib/Drupal/Core/Entity/ContentEntityNullStorage.php b/core/lib/Drupal/Core/Entity/ContentEntityNullStorage.php
index 429d185..fa01005 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityNullStorage.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityNullStorage.php
@@ -140,6 +140,13 @@ public function countFieldData($storage_definition, $as_bool = FALSE) {
   /**
    * {@inheritdoc}
    */
+  public function getHighestDelta($storage_definition) {
+    return 0;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function hasData() {
     return FALSE;
   }
diff --git a/core/lib/Drupal/Core/Entity/FieldableEntityStorageInterface.php b/core/lib/Drupal/Core/Entity/FieldableEntityStorageInterface.php
index 80fbf61..240c3c1 100644
--- a/core/lib/Drupal/Core/Entity/FieldableEntityStorageInterface.php
+++ b/core/lib/Drupal/Core/Entity/FieldableEntityStorageInterface.php
@@ -29,4 +29,14 @@
    */
   public function countFieldData($storage_definition, $as_bool = FALSE);
 
+  /**
+   * Get the highest delta for a field.
+   *
+   * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $storage_definition
+   *   The field for which to count data records.
+   *
+   * @return int
+   *   The highest delta for this field.
+   */
+  public function getHighestDelta($storage_definition);
 }
diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
index 2b4f9a4..79eb43d 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
@@ -1656,6 +1656,49 @@ public function countFieldData($storage_definition, $as_bool = FALSE) {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function getHighestDelta($storage_definition) {
+    $table_mapping = $this->getTableMapping();
+
+    if ($table_mapping->requiresDedicatedTableStorage($storage_definition)) {
+      $is_deleted = $this->storageDefinitionIsDeleted($storage_definition);
+      if ($this->entityType->isRevisionable()) {
+        $table_name = $table_mapping->getDedicatedRevisionTableName($storage_definition, $is_deleted);
+      }
+      else {
+        $table_name = $table_mapping->getDedicatedDataTableName($storage_definition, $is_deleted);
+      }
+      $query = $this->database->select($table_name, 't');
+      $query->addExpression('MAX(delta)');
+    }
+    elseif ($table_mapping->allowsSharedTableStorage($storage_definition)) {
+      // Ascertain the table this field is mapped too.
+      $field_name = $storage_definition->getName();
+      try {
+        $table_name = $table_mapping->getFieldTableName($field_name);
+      }
+      catch (SqlContentEntityStorageException $e) {
+        // This may happen when changing field storage schema, since we are not
+        // able to use a table mapping matching the passed storage definition.
+        // @todo Revisit this once we are able to instantiate the table mapping
+        //   properly. See https://www.drupal.org/node/2274017.
+        $table_name = $this->dataTable ?: $this->baseTable;
+      }
+      $query = $this->database->select($table_name, 't');
+      $query->addExpression('MAX(delta)');
+    }
+
+    // @todo Find a way to get field data also for fields having custom
+    //   storage. See https://www.drupal.org/node/2337753.
+    $delta = 0;
+    if (isset($query)) {
+      $delta = $query->execute()->fetchField();
+    }
+    return $delta;
+  }
+
+  /**
    * Determines whether the passed field has been already deleted.
    *
    * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $storage_definition
diff --git a/core/modules/field/src/Entity/FieldStorageConfig.php b/core/modules/field/src/Entity/FieldStorageConfig.php
index d4c2922..702f15c 100644
--- a/core/modules/field/src/Entity/FieldStorageConfig.php
+++ b/core/modules/field/src/Entity/FieldStorageConfig.php
@@ -705,6 +705,16 @@ public function hasData() {
   }
 
   /**
+   * Determines the highest delta for a field.
+   *
+   * @return int
+   *   The highest delta.
+   */
+  public function getHighestDelta() {
+    return \Drupal::entityManager()->getStorage($this->entity_type)->getHighestDelta($this, TRUE);
+  }
+
+  /**
    * Implements the magic __sleep() method.
    *
    * Using the Serialize interface and serialize() / unserialize() methods
diff --git a/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php b/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php
index adafcc7..9fca2db 100644
--- a/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php
+++ b/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php
@@ -67,7 +67,9 @@ public function form(array $form, FormStateInterface $form_state) {
 
     // See if data already exists for this field.
     // If so, prevent changes to the field settings.
+    $highest_delta = 1;
     if ($this->entity->hasData()) {
+      $highest_delta = $this->entity->getHighestDelta() + 1;
       $form['#prefix'] = '<div class="messages messages--error">' . $this->t('There is data for this field in the database. The field settings can no longer be changed.') . '</div>' . $form['#prefix'];
     }
 
@@ -115,8 +117,9 @@ public function form(array $form, FormStateInterface $form_state) {
     );
     $form['cardinality_container']['cardinality_number'] = array(
       '#type' => 'number',
-      '#default_value' => $cardinality != FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED ? $cardinality : 1,
-      '#min' => 1,
+      '#description' => ($highest_delta > 1) ? $this->t("Minimum is @min, as there is data for this field.", ['@min' => $highest_delta]) : '',
+      '#default_value' => $cardinality != FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED ? $cardinality : $highest_delta,
+      '#min' => $highest_delta,
       '#title' => $this->t('Limit'),
       '#title_display' => 'invisible',
       '#size' => 2,
@@ -153,6 +156,15 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
     if ($form_state->getValue('cardinality') === 'number' && !$form_state->getValue('cardinality_number')) {
       $form_state->setErrorByName('cardinality_number', $this->t('Number of values is required.'));
     }
+
+    // Validate number and current highest delta for this field.
+    if ($form_state->getValue('cardinality') != FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) {
+      // Increment by one, since delta starts from 0.
+      $highest_delta = $this->entity->getHighestDelta() + 1;
+      if ($highest_delta > $form_state->getValue('cardinality_number')) {
+        $form_state->setErrorByName('cardinality_number', $this->t('You can not set the cardinality lower than @delta', ['@delta' => $highest_delta]));
+      }
+    }
   }
 
   /**
diff --git a/core/modules/field_ui/src/Tests/ManageFieldsTest.php b/core/modules/field_ui/src/Tests/ManageFieldsTest.php
index c09550f..f81774b 100644
--- a/core/modules/field_ui/src/Tests/ManageFieldsTest.php
+++ b/core/modules/field_ui/src/Tests/ManageFieldsTest.php
@@ -272,6 +272,21 @@ function cardinalitySettings() {
     $this->assertLink(t('Field settings'));
     $this->assertLinkByHref($field_edit_path);
 
+    // Add two entries in the body.
+    $edit = ['title[0][value]' => 'Cardinality', 'body[0][value]' => 'Body 1', 'body[1][value]' => 'Body 2'];
+    $this->drupalPostForm('node/add/article', $edit, 'Save');
+    $parts = explode('/', $this->getUrl());
+    $nid = array_pop($parts);
+
+    // Assert that you can't set the cardinality to a lower number then the
+    // highest delta of this field.
+    $edit = [
+      'cardinality' => 'number',
+      'cardinality_number' => 1,
+    ];
+    $this->drupalPostForm($field_edit_path, $edit, t('Save field settings'));
+    $this->assertRaw(t('Cardinality must be higher than or equal to %minimum.', ['%minimum' => 2]), 'Correctly failed to set cardinality lower than highest delta.');
+
     // Set to unlimited.
     $edit = array(
       'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
@@ -281,6 +296,17 @@ function cardinalitySettings() {
     $this->drupalGet($field_edit_path);
     $this->assertFieldByXPath("//select[@name='cardinality']", FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
     $this->assertFieldByXPath("//input[@name='cardinality_number']", 1);
+
+    $edit = ['title[0][value]' => 'Cardinality', 'body[0][value]' => 'Body 1', 'body[1][value]' => 'Body 2'];
+    $this->drupalPostForm('node/' . $nid . '/edit', $edit, 'Save');
+    // Assert that you can't set the cardinality to a lower number then the
+    // highest delta of this field.
+    $edit = [
+      'cardinality' => 'number',
+      'cardinality_number' => 1,
+    ];
+    $this->drupalPostForm($field_edit_path, $edit, t('Save field settings'));
+    $this->assertRaw(t('Cardinality must be higher than or equal to %minimum.', ['%minimum' => 2]), 'Correctly failed to set cardinality lower than highest delta.');
   }
 
   /**
