Sfortunatamente, MySQL non supporta i vincoli CHECK . Li analizza e quindi elimina silenziosamente il vincolo, proprio come fa per i vincoli di chiave esterna su una tabella MyISAM. Non ti dà nemmeno un avviso sul tipo di vincolo non supportato, che ritengo sia una cattiva decisione di progettazione da parte loro.
Ecco una soluzione che utilizza un trigger:
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 //
Dovresti anche creare un attivatore simile BEFORE UPDATE
sullo stesso tavolo.
Vedi http://dev.mysql.com/doc/refman/ 5.6/it/segnale.html
per maggiori informazioni sul SIGNAL
istruzione per sollevare eccezioni nei trigger MySQL o nelle routine memorizzate.