Create a new database with all the tables but NO data. Make sure that the PK's are defined correctly as well as the indexes and relationships. Make sure you don't have spurious indexes created by Access. The default setting of Access automatically creates an index on table fields with certain suffixes. You want to always turn this feature OFF. You need to be incontrol over what indexes get created. It is almost worse to create unnecessary indexes as it is to not create enough.
Export each table from the database to a .csv file. Then open the new database with just the tables/relationships and load them in a logical order. link to the exported files and use append queries. When you define relationships, you need to load the high level tables first. Make a procedure to run the append queries because you are likely going to need to do this more than once. Load the lookup tables first. Then load the parent tables and then the child tables and the grandchild tables.
Compact and zip. Then test thoroughly.
I don't know how an ordinary number field gets corrupted but they can. You need to exorcise the demons though and that can be tedious.
I do know that there were two bugs in older versions of Access that caused corruption to autonumbers. One was if you defined an autonumber and made a different field the PK. When Access reloads tables as part of a compact, it sorts all the tables on PK so they get loaded in PK order (this is what fools people into thinking that tables are always sorted but that's a different issue
). However since the autonumbers are not the same sequence as the PK, the highest PK might be 992288 and that will be the last physical record for that table but that record may not have the highest value autonumber. Say the autonumber for that record is 10. The autonumber seed was getting set to 10 rather than the actual highest value which might be 1003345. So, the next record you add gets assigned the autonumber of 11 which probably already exists, but it might not if you deleted some old records so it could take a while before the seed increments to a value that duplicates an existing record. I'm pretty sure this bug has been fixed for a long time but old versions of Access ae still in use so the way to prevent this bug is to either get rid of the unused autonumber OR to make the autonumber the PK and the other field a unique index. The second solution changes nothing in the logic, It just keeps Access from making a mistake and the C&R will sort the reload into Autonumber sequence rather than the sequence of the other unique index. NEVER have an autonumber in a table UNLESS that autonumber is marked as the PK. The ONLY reason for an autonumber to ever exist at all is because it is needed as the PK for a table.
The other bug had to do with binding both a mainform and a subform to the same table and adding rows sometimes from the main form and other times from the subform.