IGNORE converts errors into warnings and lets the query succeed and ignore the new inserted values.
ON DUPLICATE KEY UPDATE updates some of the fields of the existing row with the new values.
Both clauses are used only if an UNIQUE INDEX conflict happens; they are ignored otherwise. This makes both of them work in your case #1
Basically, the goal is to only execute case 3 if PK == Duplicate and In == NULL.
A carefully crafted ON DUPLICATE KEY UPDATE clause can do the job:
INSERT INTO Inventory VALUES('PA', 'Area 1', NOW(), NULL)
ON DUPLICATE KEY UPDATE
`In` = IF(ISNULL(`In`), VALUES(`In`), `In`),
`Out` = NULL
The value of expression IF(ISNULL(`In`), VALUES(`In`), `In`) is VALUES(`In`) (the value of In in the VALUES() list to be inserted) if the current value of column In is NULL or the current value of column In if it is not NULL.
This way, the value of column In is replaced by the value provided by the INSERT query only if its current value is NULL.