-- MijnBesluit - twee mensen mogen dezelfde persoon kennen -- -- Op `persons.email` stond een UNIQUE-index. Dat botste met het uitgangspunt van -- docs/Identiteit.md: iedereen heeft zijn EIGEN aantekening over een ander, en die aantekeningen -- worden pas één zodra de persoon zelf beide uitnodigingen aanneemt. -- -- Wat er misging: voegde je iemand toe met een e-mailadres dat al ergens in de database stond - -- bij wie dan ook, ook bij een wildvreemde - dan liep het opslaan stuk op die index. Voor de -- gebruiker was dat een knop die niets deed. En het gevolg was erger dan een foutmelding: wie -- het adres van iemand het eerst invulde, bepaalde daarmee dat niemand anders die persoon nog -- kon toevoegen. In een applicatie waarin twee ouders allebei hun dochter toevoegen is dat -- precies de verkeerde kant om. -- -- Uniek blijft het wél bij `users.email`: één account per e-mailadres. Dat is iets anders dan -- een aantekening over iemand, en dat moet uniek blijven, anders weet niemand wie er inlogt. -- -- De index zelf blijft staan, alleen niet meer uniek: er wordt op adres gezocht. -- -- Draaien met: -- mysql -u root -p mijnbesluit < db\15_adres_niet_uniek.sql -- -- Opnieuw draaien mag: er gebeurt dan niets. USE `mijnbesluit`; SET @uniek := ( SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'persons' AND INDEX_NAME = 'ux_persons_email'); SET @sql := IF(@uniek > 0, 'ALTER TABLE `persons` DROP INDEX `ux_persons_email`', 'SELECT "ux_persons_email bestaat niet (meer)" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @gewoon := ( SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'persons' AND INDEX_NAME = 'ix_persons_email'); SET @sql := IF(@gewoon = 0, 'ALTER TABLE `persons` ADD INDEX `ix_persons_email` (`email`)', 'SELECT "ix_persons_email bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT 'Klaar.' AS melding;