Nếu bạn đang sử dụng nhiều cột trong một chỉ mục duy nhất và ít nhất một trong số các cột này là bắt buộc (tức là trường biểu mẫu bắt buộc), nếu bạn đặt các cột khác trong chỉ mục thành NULL, bạn có thể kết thúc bằng các hàng trùng lặp. Đó là vì giá trị NULL bị bỏ qua trong các cột duy nhất. Trong trường hợp này, sử dụng các chuỗi trống trong các cột khác của chỉ mục duy nhất để tránh các hàng trùng lặp.
THU NHẬP TRONG MỘT INDEX ĐỘC ĐÁO:
(event_type_id, event_title, ngày, địa điểm, url)
VÍ DỤ 1:
(1, 'BBQ', '2018-07-27', null, null)
(1, 'BBQ', '2018-07-27', null, null) // được phép và sao chép.
VÍ DỤ 2:
(1, 'BBQ', '2018-07-27', '', '')
(1, 'BBQ', '2018-07-27', '', '') // KHÔNG được phép vì nó được sao chép.
Dưới đây là một số mã:
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`event_id` int(11) DEFAULT NULL,
`event_title` varchar(50) DEFAULT NULL,
`date` date DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
`url` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Bây giờ chèn cái này để xem nó sẽ cho phép các hàng trùng lặp:
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
Bây giờ chèn cái này và kiểm tra xem nó không được phép:
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
Vì vậy, không có đúng hay sai ở đây. Tùy bạn quyết định điều gì phù hợp nhất với quy tắc kinh doanh của bạn.