更新日:@ greenoldmanが提案したアイデアを下のコメントに代わりに使用してください。トリガを使用してブール値フィールドを作成して、null可能フィールドがNULLかどうかに基づいて値を設定し、一意性制約のブール値フィールドと一意性を定義する他のフィールドを結合します。
私はあなたがユニーク制約を施行しなければならない場合は、この問題を回避する方法を発見しただけでなく、列に外部キーを持っている必要があり、これNULL可能であることを、それを必要とします。私の解決策はthisから派生したもので、少し余分なスペースが必要です。これは、数値のidフィールドを持つ例です。
基本的な考え方は、トリガーで外部キーが複製されたnullableフィールドの値を持つ別の非null可能フィールドを作成する必要があるということです。重複しない重複フィールドに一意の制約が適用されます。
ALTER TABLE `my_table` ADD `uniq_foo` int(10) UNSIGNED NOT NULL DEFAULT '0';
その後、あなたはこのようないくつかのトリガを定義する必要があります:あなたはこれに似た0
のデフォルト値と非NULL可能フィールドを定義する必要があり、このためには
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 ;
すると、その主くださいキー。いずれのフィールドでもNULLを許可しません。または、フィールドをnullにしないでください。 mysql docs:http://dev.mysql.com/doc/refman/5.1/en/create-index.html「すべてのエンジンでは、UNIQUEインデックスはNULLを含むことができる列に対して複数のNULL値を許可します」。 –
'NULL'は値ではありません。 @MarcBによれば、このためにNULLを許可しないことが必要です – JNK
それはバグのようです:http://bugs.mysql.com/bug.php?id=8173。 (バグレポートの少なくとも一部の人はそうだと思う) –