Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je définir des contraintes conditionnelles non nulles sur plusieurs colonnes dans mySql ?

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.