Se você estiver usando várias colunas em um índice exclusivo e pelo menos uma dessas colunas for obrigatória (ou seja, um campo de formulário obrigatório), se você definir as outras colunas no índice como NULL, poderá terminar com linhas duplicadas. Isso ocorre porque os valores NULL são ignorados em colunas exclusivas. Nesse caso, use cadeias de caracteres vazias nas outras colunas do índice exclusivo para evitar linhas duplicadas.
COLUNAS EM ÍNDICE ÚNICO:
(event_type_id, event_title, data, local, URL)
EXEMPLO 1:
(1, 'Churrasco', '27/07/2018', nulo, nulo)
(1, 'BBQ', '2018-07-27', null, null) // permitido e duplicado.
EXEMPLO 2:
(1, 'Churrasco', '2018-07-27', '', '')
(1, 'BBQ', '2018-07-27', '', '') // NÃO é permitido porque está duplicado.
Aqui estão alguns códigos:
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;
Agora insira isso para ver se isso permitirá as linhas duplicadas:
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);
Agora insira isso e verifique se não é permitido:
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', '', '');
Portanto, não há certo ou errado aqui. Cabe a você decidir o que funciona melhor com suas regras de negócios.