diff --git a/mysys/hash.c b/mysys/hash.c
index 75135a470c925402913642e5e1a66f1b69caf7df..1ba80dc6fd33ddd982b9039be1961e65ebc4d39d 100644
--- a/mysys/hash.c
+++ b/mysys/hash.c
@@ -572,6 +572,25 @@ my_bool hash_update(HASH *hash,byte *record,byte *old_key,uint old_key_length)
     previous->next=pos->next;		/* unlink pos */
 
   /* Move data to correct position */
+  if (new_index == empty)
+  {
+    /*
+      At this point record is unlinked from the old chain, thus it holds
+      random position. By the chance this position is equal to position
+      for the first element in the new chain. That means updated record
+      is the only record in the new chain.
+    */
+    if (empty != idx)
+    {
+      /*
+        Record was moved while unlinking it from the old chain.
+        Copy data to a new position.
+      */
+      data[empty]= org_link;
+    }
+    data[empty].next= NO_RECORD;
+    DBUG_RETURN(0);
+  }
   pos=data+new_index;
   new_pos_index=hash_rec_mask(hash,pos,blength,records);
   if (new_index != new_pos_index)