Si vous utilisez plusieurs colonnes dans un index unique et qu'au moins une de ces colonnes est obligatoire (c'est-à-dire un champ de formulaire obligatoire), si vous définissez les autres colonnes de l'index sur NULL, vous pouvez vous retrouver avec des lignes dupliquées. En effet, les valeurs NULL sont ignorées dans les colonnes uniques. Dans ce cas, utilisez des chaînes vides dans les autres colonnes de l'index unique pour éviter les lignes en double.
COLONNES DANS UN INDEX UNIQUE:
(event_type_id, event_title, date, lieu, url)
EXEMPLE 1:
(1, 'BBQ', '2018-07-27', null, null)
(1, 'BBQ', '2018-07-27', null, null) // autorisé et dupliqué.
EXEMPLE 2:
(1, 'BBQ', '2018-07-27', '', '')
(1, 'BBQ', '2018-07-27', '', '') // NON autorisé car il est dupliqué.
Voici quelques codes:
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;
Insérez maintenant ceci pour voir qu'il autorisera les lignes dupliquées:
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);
Insérez maintenant ceci et vérifiez que ce n'est pas autorisé:
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', '', '');
Il n'y a donc ni bien ni mal ici. C'est à vous de décider ce qui fonctionne le mieux avec les règles de votre entreprise.