UPDATE column without FK fires other FK triggers constraint check
Tom Lane answered on the mailing list

This happens because an UDPATE invalidates the foreign key triggers for a previous INSERT in the same transaction, so postgres fires them when there is an old tuple version in the same transaction. It doesn't have the data to know that the previous change on that row was an update without fk changes.