CẬP NHẬT: Bạn nên sử dụng ý tưởng được gợi ý bởi @greenoldman trong nhận xét bên dưới để thay thế. Tạo một trường boolean với các trigger để thiết lập giá trị dựa trên trường nullable của bạn là NULL hay không và sau đó kết hợp trường boolean trong một ràng buộc duy nhất với các trường khác xác định tính duy nhất.
Tôi đã tìm ra cách giải quyết vấn đề này nếu bạn phải thực thi ràng buộc duy nhất nhưng cũng cần phải có khóa ngoài trên cột, do đó yêu cầu nó phải rỗng. Giải pháp của tôi có nguồn gốc từ this và sẽ cần thêm một chút không gian. Đây là một ví dụ với trường id số.
Khái niệm cơ bản là bạn phải tạo một trường không nullable khác sẽ có giá trị của trường rỗng của bạn với khóa ngoài được sao chép vào nó bằng trình kích hoạt. Ràng buộc duy nhất sau đó sẽ được thực thi trên trường trùng lặp không thể vô hiệu.Để làm điều này bạn cần phải xác định một lĩnh vực không nullable với một giá trị mặc định của 0
tương tự như sau:
ALTER TABLE `my_table` ADD `uniq_foo` int(10) UNSIGNED NOT NULL DEFAULT '0';
Sau đó, bạn chỉ cần xác định một số trigger như thế này:
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 ;
Nguồn
2014-11-21 02:54:16
Làm cho nó một tiểu , không cho phép null trong cả hai trường. Hoặc làm cho các trường không rỗng. Theo tài liệu mysql: http://dev.mysql.com/doc/refman/5.1/en/create-index.html "Đối với tất cả các công cụ, một chỉ số UNIQUE cho phép nhiều giá trị null cho các cột có thể chứa null". –
'NULL' không phải là giá trị. Như @MarcB nói, bạn cần phải không cho phép 'NULL' cho cái này – JNK
Có vẻ như đó là một lỗi: http://bugs.mysql.com/bug.php?id=8173. (Ít nhất một số người trong báo cáo lỗi nghĩ như vậy) –