Distinguish between unknown and non-present foreign keys
There is a mismatch between you and your DBMS regarding special values.  Special values are special in your mind, but the DBMS can't tell that a special value is different from an ordinary value.  So when you put a special value in, it expects a valid reference to a row in the lookup table.  If the reference is invalid, it flags a constraint error.

There is a way you can get around this, but it will create further problems down the road.  You can put the special value in as a key in the lookup table, with some sort of descriptive field set to "[Unknown Value]".  Then, when you do the join, this text will pop up in place of the known value.  

I hesitate to recommend this solution.  In every case where I had to work with this, dummy values in lookup tables ended up causing more problems than they solved:

Wherever the foreign key and the primary key are joined, you have to include a condition to weed out the special values, if appropriate.  If you forget, that's a bug.  It you don't forget, that's a slowdown.

It depends on what the special value means.  If the special value means "this is not a value", among other things, then there is, conceptually, nothing to join to.  If the actual join produces a result, that result is likely to be meaningless or misleading.

But, if it works for you, great.