diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.install b/modules/field/modules/field_sql_storage/field_sql_storage.install
index efb734fb5d0cf78fdf59a2a356a15f48ec0fbe03..379459dfc37c68da93d873735a939d4903682d83 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.install
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.install
@@ -113,27 +113,31 @@ function field_sql_storage_update_7001(&$sandbox) {
     $sandbox['tables'] = array();
     $results = db_select('field_config', 'fc', array('fetch' => PDO::FETCH_ASSOC))
       ->fields('fc')
+      ->condition('storage_module', 'field_sql_storage')
       ->execute();
     foreach ($results as $field) {
       if ($field['deleted']) {
-        $sandbox['tables'][] = "field_deleted_data_{$field['id']}";
-        $sandbox['tables'][] = "field_deleted_revision_{$field['id']}";
+        $sandbox['tables']["field_deleted_data_{$field['id']}"] = 'data';
+        $sandbox['tables']["field_deleted_revision_{$field['id']}"] = 'revision';
       }
       else {
-        $sandbox['tables'][] = "field_data_{$field['field_name']}";
-        $sandbox['tables'][] = "field_revision_{$field['field_name']}";
+        $sandbox['tables']["field_data_{$field['field_name']}"] = 'data';
+        $sandbox['tables']["field_revision_{$field['field_name']}"] = 'revision';
       }
     }
+    reset($sandbox['tables']);
 
     $sandbox['total'] = count($sandbox['tables']);
     $sandbox['progress'] = 0;
   }
 
   if ($sandbox['tables']) {
-    $table = array_pop($sandbox['tables']);
+    // Grab the next table to process.
+    $table = key($sandbox['tables']);
+    $type = array_shift($sandbox['tables']);
 
-    if (db_table_exists($table)) {
-      // Add the 'entity_type' column.
+    // Add the 'entity_type' column.
+    if (!db_field_exists($table, 'entity_type')) {
       $column = array(
         'type' => 'varchar',
         'length' => 128,
@@ -151,12 +155,20 @@ function field_sql_storage_update_7001(&$sandbox) {
           ->execute();
       }
 
-      // Add indexes for the 'entity_type' column.
-      db_drop_primary_key($table);
-      db_add_primary_key($table, array('entity_type', 'entity_id', 'deleted', 'delta', 'language'));
+      // Index the new column.
       db_add_index($table, 'entity_type', array('entity_type'));
+    }
+
+    // Use the 'entity_type' column in the primary key.
+    db_drop_primary_key($table);
+    $primary_keys = array(
+      'data' => array('entity_type', 'entity_id', 'deleted', 'delta', 'language'),
+      'revision' => array('entity_type', 'entity_id', 'revision_id', 'deleted', 'delta', 'language'),
+    );
+    db_add_primary_key($table, $primary_keys[$type]);
 
-      // Drop the 'etid' column.
+    // Drop the 'etid' column.
+    if (db_field_exists($table, 'etid')) {
       db_drop_field($table, 'etid');
     }
 
@@ -178,6 +190,25 @@ function field_sql_storage_update_7001(&$sandbox) {
   }
 }
 
+/**
+ * Fix primary keys in field revision data tables.
+ */
+function field_sql_storage_update_7002() {
+  $results = db_select('field_config', 'fc', array('fetch' => PDO::FETCH_ASSOC))
+    ->fields('fc')
+    ->condition('storage_module', 'field_sql_storage')
+    ->execute();
+  foreach ($results as $field) {
+    // Revision tables of deleted fields do not need to be fixed, since no new
+    // data is written to them.
+    if (!$field['deleted']) {
+      $table = "field_revision_{$field['field_name']}";
+      db_drop_primary_key($table);
+      db_add_primary_key($table, array('entity_type', 'entity_id', 'revision_id', 'deleted', 'delta', 'language'));
+    }
+  }
+}
+
 /**
  * @} End of "defgroup field-updates-6.x-to-7.x"
  */
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.module b/modules/field/modules/field_sql_storage/field_sql_storage.module
index 26f3d8fe49385b11b61d9db978cd3f720beb300d..916649b4e89022caa695a2c0bc272ce99d343a41 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.module
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.module
@@ -159,7 +159,6 @@ function _field_sql_storage_schema($field) {
         'description' => 'The sequence number for this data item, used for multi-value fields',
       ),
     ),
-    // @todo Is the primary key needed at all ?
     'primary key' => array('entity_type', 'entity_id', 'deleted', 'delta', 'language'),
     'indexes' => array(
       'entity_type' => array('entity_type'),
@@ -196,12 +195,10 @@ function _field_sql_storage_schema($field) {
     }
   }
 
-  // Construct the revision table. The primary key includes
-  // revision_id but not entity_id so that multiple revision loads can
-  // use the IN operator.
+  // Construct the revision table.
   $revision = $current;
   $revision['description'] = "Revision archive storage for {$deleted}field {$field['id']} ({$field['field_name']})";
-  $revision['primary key'] = array('entity_type', 'revision_id', 'deleted', 'delta', 'language');
+  $revision['primary key'] = array('entity_type', 'entity_id', 'revision_id', 'deleted', 'delta', 'language');
   $revision['fields']['revision_id']['not null'] = TRUE;
   $revision['fields']['revision_id']['description'] = 'The entity revision id this data is attached to';