Entries can be updated when we generate a new code, or we can just create new entries for invalidated e-mails. That we we can see how many codes are sent to an e-mail, and even limit the number that are sent before we stop sending them until the user requests a new one.
As per chat, here's a great idea for a separate table for e-mail validation:
email_queue: id, email, user(user.id), code, codeCreationTime, validationTime
Entries can be updated when we generate a new code, or we can just create new entries for invalidated e-mails. That we we can see how many codes are sent to an e-mail, and even limit the number that are sent before we stop sending them until the user requests a new one.