ozzii,
I think Pat explained the approach nicely, so just a few recommendations from my side.
Before doing the try/fix/try cycle, do a little analysis in the source data for other data-related problems to save a few iterations

. Look for duplicates, weird default values or broken data integrity. During systems lifecycle admins tend to drop constraints to facilitate data that were not counted on in the original model.
During try/fix cycle, enable constraints in target one by one, then re-load data to incrementally identify problem groups (they will be rejected by database).
Finally, I suggest doing audit counts to discover any rejected data. Also is possible check the app sitting on top of your database to see if it is affected.
In terms of the missing data, you have several options:
1. You can try to populate the missing data from other sources (e.g other system, other tables, have users type it in). Correct the data in stage, then load to target.
2. You are not able to correct the data. Then you have to fall back to default values (-1, 01/01/1970, etc.). If you use this approach DOCUMENT it, because the application/users must be ready for that!
Another possibility is not to migrate the records with missing data and place them to a reject file/table. Once again, backup and document that, as someone might come looking for the missing data.
I very much support Pat's suggestion to use ETL, but with my background I am a bit biased

. While SQL scripting will definitely work if you just migrate within one database, consider using ETL tools if there is some complex data manipulation expected (e.g. one table is mapped to many, data must be validated/recalculated). Today's tools lets you visualize that process, so it is much easier to inspect, debug and understand the migration rules.
Regarding the MD5, either use the built-in md5() function in MySQL, or calculate it on the fly in your ETL job.
HTH,
Michal