-- MijnBesluit - profielen samenvoegen -- -- Twee mensen kunnen allebei een profiel aanmaken voor dezelfde persoon. Jij voegt je dochter -- toe, je ex-partner doet dat ook: twee rijen in `persons`, allebei een eerlijke aantekening -- van degene die hem maakte. Dat is geen fout, zolang niemand het profiel heeft geclaimd. -- -- Zodra zij beide uitnodigingen aanneemt, zegt zij zelf dat het om haar gaat. Dan gaat het ene -- profiel op in het andere. Het duplicaat blijft staan - er hangt geschiedenis aan, en een -- verwijderde rij is niet terug te halen - maar wijst voortaan naar waar hij in is opgegaan: -- -- merged_into_person_id : het profiel waarin deze is opgegaan. Leeg = gewoon in gebruik. -- -- Alles wat naar het duplicaat verwees is op dat moment verhuisd: lidmaatschappen, berichten, -- foto's, uitnodigingen en rollen in een nalatenschap. -- -- Draaien met: -- mysql -u root -p mijnbesluit < db\09_samenvoegen.sql -- -- Opnieuw draaien mag: er gebeurt dan niets. USE `mijnbesluit`; -- ---------------------------------------------------------------- merged_into_person_id SET @bestaat := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'persons' AND COLUMN_NAME = 'merged_into_person_id'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `persons` ADD COLUMN `merged_into_person_id` BIGINT NULL', 'SELECT "merged_into_person_id bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------------------------------------------- index -- Elke lijst met mensen filtert hierop, dus hij wordt vaak gelezen. SET @bestaat := ( SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'persons' AND INDEX_NAME = 'ix_persons_merged'); SET @sql := IF(@bestaat = 0, 'CREATE INDEX `ix_persons_merged` ON `persons` (`merged_into_person_id`)', 'SELECT "ix_persons_merged bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------------------------------------------- verwijzing naar zichzelf SET @bestaat := ( SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'persons' AND CONSTRAINT_NAME = 'fk_persons_merged'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `persons` ADD CONSTRAINT `fk_persons_merged` FOREIGN KEY (`merged_into_person_id`) REFERENCES `persons` (`id`) ON DELETE SET NULL', 'SELECT "fk_persons_merged bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT 'Klaar. Profielen kunnen vanaf nu worden samengevoegd.' AS melding;