55 lines
2.6 KiB
SQL
55 lines
2.6 KiB
SQL
-- 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;
|