Generic Trigger on MYSQL to replicate data on other table
One idea would be to write:

CREATE TRIGGER `after_insert_log_competency` 
AFTER INSERT ON `competencies` 
FOR EACH ROW
   INSERT INTO history_competencies SELECT *, 'CREATE' FROM competencies WHERE id=NEW.id;


That doesn't work well for deletions, as the row wouldn't exist anymore. Also, you are doing an extra eq_ref for each write.

But be careful, because if you ALTER competencies without altering history_competencies, all your INSERTS, etc. on competencies will fail due to the trigger failing.

If you do very frequently ALTERs, and all you do is inserting and selecting those new fields, you could serialize them to a single BLOB. That is a very denormal form, with a lot of drawbacks (no constraints, no indexes, difficult to update a single field), but it may be interesting in some cases.