-- Folgezähler-Kette: Meter zeigt optional auf den Vorgänger. -- Beim Wechsel können wir dann sowohl die Kette für die UI anzeigen -- als auch alle Verträge mit dem Vorgänger automatisch auf den -- Nachfolger umstellen. -- -- ON DELETE SET NULL, damit ein versehentlich gelöschter Vorgänger -- den Nachfolger nicht killt. -- -- IF NOT EXISTS macht den Re-Deploy auf Prod sicher, falls jemand -- schon `prisma db push` gefahren hat. ALTER TABLE `Meter` ADD COLUMN IF NOT EXISTS `predecessorMeterId` INT NULL; -- Index nur anlegen, wenn er noch nicht da ist SET @idx_exists := ( SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'Meter' AND INDEX_NAME = 'Meter_predecessorMeterId_fkey' ); SET @sql := IF( @idx_exists = 0, 'CREATE INDEX `Meter_predecessorMeterId_fkey` ON `Meter`(`predecessorMeterId`)', 'SELECT "Index existiert bereits"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- Foreign Key nur anlegen, wenn er noch nicht da ist SET @fk_exists := ( SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'Meter' AND CONSTRAINT_NAME = 'Meter_predecessorMeterId_fkey' AND CONSTRAINT_TYPE = 'FOREIGN KEY' ); SET @sql := IF( @fk_exists = 0, 'ALTER TABLE `Meter` ADD CONSTRAINT `Meter_predecessorMeterId_fkey` FOREIGN KEY (`predecessorMeterId`) REFERENCES `Meter`(`id`) ON DELETE SET NULL ON UPDATE CASCADE', 'SELECT "FK existiert bereits"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;