Magento does not make it easy to change SKUs in bulk. Try to do it via the import/export or dataflow profiles and you run into all kinds of problems. There is, however, a fairly easy way to do it and it simply involves adding a php script to your server and a CSV file of before and after SKUs. Here’s the step-by-step;
Note: Be sure to test this with only one or two product SKUs before doing it with all your SKUs. Also, be sure to backup your database before attempting this.
1. Create a CSV File with Before and After SKUs
In the first column, list your current SKUs and in the second column list the new SKUs.
Do not include headings in your CSV file.
Be sure this file is saved as a CSV file in the UTF-8 or ANSI encoding. You might run into problems with this if you create the file using Excel.
2. Put the CSV File on Your Server
Upload the CSV file to the var/export directory on your Magento server so that it’s path is /var/export/sku2sku.csv.
3. Create the PHP Script
On your server, in your Magento installation directory (the one where you see the app, var, skin, media, js and other directories), create a new file, save it, and name it “updateskus.php”.
Paste the following php code into updateskus.php and save the file.
<?php
include_once './app/Mage.php';
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$updates_file="./var/export/sku2sku.csv";
$sku_entry=array();
$updates_handle=fopen($updates_file, 'r');
if($updates_handle) {
while($sku_entry=fgetcsv($updates_handle, 1000, ",")) {
$old_sku=$sku_entry[0];
$new_sku=$sku_entry[1];
echo "<br>Updating ".$old_sku." to ".$new_sku." - ";
try {
$get_item = Mage::getModel('catalog/product')->loadByAttribute('sku', $old_sku);
if ($get_item) {
$get_item->setSku($new_sku)->save();
echo "successful";
} else {
echo "item not found";
}
} catch (Exception $e) {
echo "Cannot retrieve products from Magento: ".$e->getMessage()."<br>";
return;
}
}
}
fclose($updates_handle);
?>
4. Run the Script
To run the script simply use your internet browser and navigate to http://yoursite.com/updateskus.php. If you have a multi-site setup use the master or primary site as set by your hosting provider.
When the page opens you should see confirmation messages that your SKUs were updated. Your SKUs should now be successfully updated.
If you’re finished updating the SKUs, remove the CSV and PHP files that you added to the server.
5. Errors
If you run into the following error, don’t worry too much. Just re-run the script and see if more SKUs get updated.
Cannot retrieve products from Magento: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction
If you have a lot of SKUs to update you can expect the script to take several minutes at least, to complete.
This method was tested on a multi-site Magento Community 1.6.1 installation.
This method is based on this Magento Commerce article.
(Update Sep. 20, 2013) One of the readers noted that the script modified the ‘Main Website’ store view. When this happened, it resulted in products no longer using the ‘default’ data such description, name, etc. The reader suggested replacing the line “Mage::app();” with “Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);”. I haven’t tested it myself, but it looks like it should work, so I updated the code shown above. Thanks, Andrew!