INSERT IGNORE is reached for to skip rows that already exist. What it actually does is downgrade every error in the statement to a warning, which is a much larger promise than the one you wanted.
INSERT IGNORE INTO customers (id, email, age)
VALUES (91, 'not-an-email', 'abc');
-- inserted. age became 0, no error raised.
SHOW WARNINGS;
Data truncation, an out-of-range number, a bad date, a foreign key violation — all silently ignored, and the row lands with defaults where the data should have been. If the intent is only “skip duplicates”, INSERT ... ON DUPLICATE KEY UPDATE id = id expresses that exactly and leaves every other error intact. Reserve IGNORE for bulk loads where you have already validated the input.