INSERT IGNORE swallows more errors than the duplicate you meant

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.