Si está utilizando varias columnas en un índice único y al menos una de estas columnas es obligatoria (es decir, un campo de formulario obligatorio), si establece las otras columnas en el índice como NULL, puede terminar con filas duplicadas. Esto se debe a que los valores NULL se ignoran en columnas únicas. En este caso, use cadenas vacías en las otras columnas del índice único para evitar filas duplicadas.
COLUMNAS EN UN ÍNDICE ÚNICO:
(event_type_id, event_title, date, location, url)
EJEMPLO 1:
(1, 'BBQ', '2018-07-27', nulo, nulo)
(1, 'BBQ', '2018-07-27', null, null) // permitido y duplicado.
EJEMPLO 2:
(1, 'BBQ', '2018-07-27', '', '')
(1, 'BBQ', '2018-07-27', '', '') // NO está permitido ya que está duplicado.
Aquí hay algunos 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;
Ahora inserte esto para ver que permitirá las filas 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);
Ahora inserte esto y verifique que no esté 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', '', '');
Entonces, no hay correcto o incorrecto aquí. Depende de usted decidir qué funciona mejor con sus reglas comerciales.