ACTUALIZACIÓN: Se debe utilizar la idea sugerida por @greenoldman en el comentario anterior en su lugar. Cree un campo booleano con disparadores para establecer el valor según si su campo que admite nulos es NULL o no y luego combine el campo booleano en una restricción única con los otros campos que definen la exclusividad.
He encontrado una forma de evitar este problema si debe cumplir la restricción única, pero también es necesario tener una clave externa en la columna, por lo que requiere que sea anulable. Mi solución se derivó de this y requerirá un poco más de espacio. Este es un ejemplo con un campo numérico de identificación.
El concepto básico es que debe crear otro campo no anulable que tendrá el valor de su campo anulable con la clave foránea duplicada con un activador. La restricción única se aplicará en el campo duplicado no nulo.Para ello es necesario definir un campo no acepta valores NULL con un valor por defecto de 0
similar a esto:
ALTER TABLE `my_table` ADD `uniq_foo` int(10) UNSIGNED NOT NULL DEFAULT '0';
A continuación, sólo tiene que definir algunos factores desencadenantes de esta manera:
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 ;
la convierten en una primaria clave, que no permite nulos en ninguno de los campos. O haz que los campos no sean nulos. De acuerdo con los documentos de mysql: http://dev.mysql.com/doc/refman/5.1/en/create-index.html "Para todos los motores, un índice ÚNICO permite valores nulos múltiples para las columnas que pueden contener nulo". –
'NULL' no es un valor. Como dice @MarcB, debe rechazar 'NULL' para este – JNK
Parece que es un error: http://bugs.mysql.com/bug.php?id=8173. (Al menos algunas personas en el informe de errores lo creen así) –