Infelizmente, MySQL não suporta restrições CHECK . Ele as analisa e então descarta silenciosamente a restrição, assim como faz para restrições de chave estrangeira em uma tabela MyISAM. Ele nem mesmo avisa sobre o tipo de restrição não suportado, o que eu acho que é uma má decisão de design da parte deles.
Aqui está uma solução usando um gatilho:
mysql> DELIMITER //
mysql> CREATE TRIGGER check_one_not_null BEFORE INSERT ON mytable FOR EACH ROW
IF COALESCE(NEW.D, NEW.E, NEW.F) IS NULL
THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'One of D, E, or F must have a non-null value.';
END IF //
Você também deve criar um gatilho semelhante
BEFORE UPDATE
na mesma mesa. Consulte http://dev.mysql.com/doc/refman/ 5.6/en/signal.html para mais informações sobre o
SIGNAL
instrução para levantar exceções em gatilhos MySQL ou rotinas armazenadas.