AGGIORNAMENTO: Si consiglia di utilizzare l'idea suggerita dal @greenoldman nel commento qui sotto invece. Creare un campo booleano con trigger per impostare il valore in base al fatto che il campo nullable sia NULL o no e quindi combinare il campo booleano in un vincolo univoco con gli altri campi che definiscono l'unicità.
Ho trovato un modo per aggirare questo problema se si deve rispettare il vincolo unico, ma anche bisogno di avere una chiave esterna per la colonna, richiedendo così che sia annullabile. La mia soluzione era derivata da this e richiede un po 'di spazio in più. Questo è un esempio con un campo ID numerico.
Il concetto di base è che è necessario creare un altro campo non nullable che avrà il valore del campo nullable con la chiave esterna duplicata in esso con un trigger. Il vincolo univoco verrà quindi applicato al campo duplicato non annullabile.Per fare questo è necessario definire un campo non annullabile con un valore predefinito di 0
simile a questo:
ALTER TABLE `my_table` ADD `uniq_foo` int(10) UNSIGNED NOT NULL DEFAULT '0';
Poi devi solo definire alcuni trigger come questo:
DROP TRIGGER IF EXISTS `my_table_before_insert`;
DELIMITER ;;
CREATE TRIGGER `my_table_before_insert` BEFORE INSERT ON `my_table`
FOR EACH ROW
BEGIN
SET NEW.uniq_foo = IFNULL(NEW.foo_id, 0);
END;;
DELIMITER ;
DROP TRIGGER IF EXISTS `my_table_before_update`;
DELIMITER ;;
CREATE TRIGGER `my_table_before_update` BEFORE UPDATE ON `my_table`
FOR EACH ROW
BEGIN
SET NEW.uniq_foo = IFNULL(NEW.foo_id, 0);
END;;
DELIMITER ;
fonte
2014-11-21 02:54:16
Fai un primario chiave, che non consente null in nessuno dei due campi. O rendere i campi non nulli. Come da mysql docs: http://dev.mysql.com/doc/refman/5.1/en/create-index.html "Per tutti i motori, un indice UNIQUE consente più valori nulli per le colonne che possono contenere null". –
'NULL' non è un valore. Come dice @MarcB, devi disabilitare 'NULL' per questo – JNK
Sembra che sia un bug: http://bugs.mysql.com/bug.php?id=8173. (Almeno alcune persone nella segnalazione bug la pensano così) –