Your idea is good, but your implementation is not :-)
A username is not a very good choice for a primary key, because it can change, and like you said, if it changes it much change in all references aswell, or the data explodes.
Therefor, data such as name, address, phone etc should be stored in only one table, where each record has a primary key consisting of an auto_incremented number.
All other tables that reference this userdata would have a foreign key pointing to that auto_incrementing column of the userdata's primary key.
Now you can change the names as often as you like, that does not change the value of the primary key, which means your data stays in tact without any updates.
Another reason not to use a name for a primary key is that it is perfectly ok to have two persons with the same name. it's very possible to have two John Smith's, but a primary key cannot contain duplicates.