Beetle,
Zip codes are strings and cannot be correctly stored as text. That would put New England out of business because the leading zero would be dropped
I think you meant to say that Zip Codes cannot be correctly stored as
numbers, and I agree, but that's not what I was suggesting. The OP has a surrogate Autonumber primary key (ZipID) in his Zip Code table, so my suggestion was to store that value in FK fields in the shipment table. Those FK fields would need to be number in that scenario.
I'm not arguing the merits of Zip Code tables. I agree with you that they are not always 100% reliable, I was only making a suggestion based on the OP's particular circumstances. If a person is going to use City and State info from a Zip Code table to update close to 5000 records in another table for the purposes of a report or something (which appeared to be the case here), then they are in essence relying strictly on the Zip Code table for the data, so why run the update in the first place? You don't really gain anything, and, if there
is outdated information in the Zip Code table, then you now have outdated information in two places. Better (IMHO) to just join the Zip Code table in a query in this circumstance (either on ZipID to numeric FK fields, or on the existing ZipCode text fields).
I still store the city and state and allow not in list entries for the zip. That allows the data entry clerk to override the info coming from the zip code table if it conflicts with what the customer is saying is valid.
I don't disagree with you here either, but this is something, I would think, that you are doing at the point of data entry, and the data (City/State) is being stored in the Customers or Vendors table, not a Shipments table, no?