OK, I solved it.
Migrations attempted to modify auth.user, but it seems MYSQL checks the referential integrity of any child table with a FK to the table being modified. My child table had bad foreign keys, hence the error during migration.
Side note: whe way I got these foreign key errors was not because of a failure to cascade, or a glitch in the app, but rather because of how I initially populated my tests database using an SQL dump of various tables from the live database (but not the user table). It just so happens this particular table is used for quite generic records (user=null) as well as user-specific records, and I'd imported the whole lot.
It makes sense that MYSQL allows you to import whatever you like in this fashion, but it means you need to be careful what you import. If you need to do an ad-hoc referential integrity check, here's a sproc:
https://forums.mysql.com/read.php?20,137634
So this glitch doesn't/won't happen in the live database.
Anyway, back to resolving the myriad other things that are breaking due to the migration, yay!
Thanks for chipping in Dylan, it did actually help.
Andrew