diff --git a/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php b/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php
index 27c8e78..41108c0 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php
@@ -1207,6 +1207,14 @@ public static function _fieldSqlSchema(FieldConfigInterface $field, array $schem
       $current['fields'][$real_name] = $attributes;
     }
 
+    // Add unique keys.
+    foreach ($schema['unique keys'] as $unique_keý_name => $columns) {
+      $real_name = static::_fieldIndexName($field, $unique_keý_name);
+      foreach ($columns as $column_name) {
+        $current['unique keys'][$real_name][] = static::_fieldColumnName($field, $column_name);
+      }
+    }
+
     // Add indexes.
     foreach ($schema['indexes'] as $index_name => $columns) {
       $real_name = static::_fieldIndexName($field, $index_name);
diff --git a/core/lib/Drupal/Core/Field/FieldDefinition.php b/core/lib/Drupal/Core/Field/FieldDefinition.php
index cfeccf8..b2750ec 100644
--- a/core/lib/Drupal/Core/Field/FieldDefinition.php
+++ b/core/lib/Drupal/Core/Field/FieldDefinition.php
@@ -479,6 +479,7 @@ public function getSchema() {
       $schema = $class::schema($this);
       // Fill in default values.
       $schema += array(
+        'unique keys' => array(),
         'columns' => array(),
         'indexes' => array(),
         'foreign keys' => array(),
diff --git a/core/lib/Drupal/Core/Field/FieldItemInterface.php b/core/lib/Drupal/Core/Field/FieldItemInterface.php
index d10790d..3943bad 100644
--- a/core/lib/Drupal/Core/Field/FieldItemInterface.php
+++ b/core/lib/Drupal/Core/Field/FieldItemInterface.php
@@ -69,6 +69,8 @@ public static function mainPropertyName();
    *     definitions depend on field settings when possible. No assumptions
    *     should be made on how storage engines internally use the original
    *     column name to structure their storage.
+   *   - unique keys: (optional) An array of Schema API unique key definitions.
+   *     Only columns that appear in the 'columns' array are allowed.
    *   - indexes: (optional) An array of Schema API index definitions. Only
    *     columns that appear in the 'columns' array are allowed. Those indexes
    *     will be used as default indexes. Callers of field_create_field() can
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
index 15cbe74..e91888d 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\Core\Field\Plugin\Field\FieldType;
 
+use Drupal\Core\Field\FieldDefinitionInterface;
+
 /**
  * Defines the 'uuid' entity field type.
  *
@@ -39,4 +41,14 @@ public function applyDefaultValue($notify = TRUE) {
     $this->setValue(array('value' => $uuid->generate()), $notify);
     return $this;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function schema(FieldDefinitionInterface $field_definition) {
+    $schema = parent::schema($field_definition);
+    $schema['unique keys']['value'] = array('value');
+    return $schema;
+  }
+
 }
diff --git a/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php b/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php
index 5ec5f0c..12ea914 100644
--- a/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php
+++ b/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php
@@ -455,7 +455,7 @@ public function getSchema() {
       $class = $this->getFieldItemClass();
       $schema = $class::schema($this);
       // Fill in default values for optional entries.
-      $schema += array('indexes' => array(), 'foreign keys' => array());
+      $schema += array('unique keys' => array(), 'indexes' => array(), 'foreign keys' => array());
 
       // Check that the schema does not include forbidden column names.
       if (array_intersect(array_keys($schema['columns']), static::getReservedColumns())) {
diff --git a/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php b/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php
index f48c48c..a7680d3 100644
--- a/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php
@@ -94,6 +94,7 @@ public function testTestItem() {
           'not null' => FALSE,
         ),
       ),
+      'unique keys' => array(),
       'indexes' => array(
         'value' => array('value'),
       ),
diff --git a/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php b/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php
index 162b937..d6d281b 100644
--- a/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php
@@ -98,6 +98,7 @@ public function testFieldSqlSchemaForEntityWithStringIdentifier() {
           'not null' => FALSE,
         ),
       ),
+      'unique keys' => array(),
       'indexes' => array(),
       'foreign keys' => array(),
     );
