Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso definire vincoli condizionali non nulli su più colonne in mySql?

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.