Vous ne pouvez malheureusement pas créer une telle contrainte, car la clé étrangère est toujours basée sur une table parent.
Ce que vous pouvez faire est de créer le déclencheur qui testera vos données d'entrée en fonction de leur type et annulera les modifications inappropriées :
Quelque chose comme ça :
CREATE TRIGGER insert_stock_child
BEFORE INSERT
ON stock
FOR EACH ROW
BEGIN
IF new.type = 'BOOK_TYPE' AND (SELECT COUNT(*) FROM book
WHERE book.bookID = new.itemID)= 0
THEN
INSERT error_msg VALUES ('No such book!');
END IF;
END;
-- same logic for the cd table