残念ながら、MySQL は、CHECK制約をサポートしていません 。 MyISAMテーブルの外部キー制約の場合と同様に、それらを解析してから、制約をサイレントに破棄します。サポートされていない制約タイプについての警告も表示されません。これは、設計上の決定としては不適切だと思います。
トリガーを使用した解決策は次のとおりです。
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 //
同様のトリガーをBEFORE UPDATE
で作成する必要もあります 同じテーブルに。
http://dev.mysql.com/doc/refman/を参照してください5.6 / en / signal.html
SIGNAL
の詳細については MySQLトリガーまたはストアドルーチンで例外を発生させるステートメント。