Malheureusement, MySQL ne prend pas en charge les contraintes CHECK . Il les analyse, puis supprime silencieusement la contrainte, tout comme il le fait pour les contraintes de clé étrangère sur une table MyISAM. Il ne vous donne même pas d'avertissement concernant le type de contrainte non pris en charge, ce qui, à mon avis, est une mauvaise décision de conception de leur part.
Voici une solution utilisant un déclencheur :
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 //
Vous devez également créer un déclencheur similaire BEFORE UPDATE
sur la même table.
Voir http://dev.mysql.com/doc/refman/ 5.6/fr/signal.html
pour plus d'informations sur le SIGNAL
déclaration pour lever des exceptions dans les déclencheurs MySQL ou les routines stockées.