Se si utilizzano più colonne in un indice univoco e almeno una di queste colonne è obbligatoria (ovvero un campo modulo obbligatorio), se si impostano le altre colonne nell'indice su NULL, è possibile che si verifichino righe duplicate. Questo perché i valori NULL vengono ignorati in colonne univoche. In questo caso, utilizzare stringhe vuote nelle altre colonne dell'indice univoco per evitare righe duplicate.
COLONNE IN UN INDICE UNICO:
(event_type_id, event_title, data, posizione, url)
ESEMPIO 1:
(1, "BBQ", "2018-07-27", null, null)
(1, 'BBQ', '2018-07-27', null, null) // consentito e duplicato.
ESEMPIO 2:
(1, 'BBQ', '2018-07-27', '', '')
(1, 'BBQ', '2018-07-27', '', '') // NON consentito poiché duplicato.
Ecco alcuni codici:
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;
Ora inserisci questo per vedere che consentirà le righe duplicate:
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);
Ora inseriscilo e verifica che non sia consentito:
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', '', '');
Quindi, non c'è giusto o sbagliato qui. Sta a te decidere cosa funziona meglio con le tue regole aziendali.