Last active
September 13, 2016 14:42
-
-
Save jairovm/98e0273c45fd16b0acd78a675e115c65 to your computer and use it in GitHub Desktop.
Playing aroung with mysql table migration without downtime
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
More info: https://gist.github.com/bennadel/2395d7a84dda980a3ae3 | |
*/ | |
CREATE TABLE `friends` ( | |
`id` MEDIUMINT(1) unsigned NOT NULL AUTO_INCREMENT, | |
`name` varchar(30) NOT NULL, | |
PRIMARY KEY (`id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=UTF8; | |
CREATE TABLE `friends_shadow` ( | |
`id` int(1) unsigned NOT NULL AUTO_INCREMENT, | |
`name` varchar(30) NOT NULL, | |
PRIMARY KEY (`id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=UTF8; | |
ALTER TABLE `friends_shadow` | |
ADD COLUMN `isBFF` tinyint(1) NOT NULL DEFAULT 0 AFTER `name`, | |
ADD COLUMN `updatedAt` datetime DEFAULT NULL AFTER `isBFF`, | |
ADD INDEX `IX_bestFriends` ( `isBFF` ); | |
DELIMITER $$ | |
CREATE TRIGGER `insert_friends_shadow` AFTER INSERT ON `friends` | |
FOR EACH ROW BEGIN | |
INSERT INTO `friends_shadow` | |
( `id`, `name`, `isBFF`, `updatedAt`) | |
VALUES | |
( NEW.id, NEW.name, 0, UTC_TIMESTAMP() ) | |
; | |
END$$ | |
CREATE TRIGGER `update_friends_shadow` AFTER UPDATE ON `friends` | |
FOR EACH ROW BEGIN | |
UPDATE `friends_shadow` | |
SET `name` = NEW.name, `updatedAt` = UTC_TIMESTAMP() | |
WHERE `id` = OLD.id | |
; | |
END$$ | |
CREATE TRIGGER `delete_friends_shadow` AFTER DELETE ON `friends` | |
FOR EACH ROW BEGIN | |
DELETE FROM `friends_shadow` | |
WHERE id = OLD.id | |
; | |
END$$ | |
DELIMITER ; | |
/* | |
ALTER TABLE friends MODIFY id MEDIUMINT unsigned NOT NULL AUTO_INCREMENT; | |
ALTER TABLE friends MODIFY id BIGINT unsigned NOT NULL AUTO_INCREMENT; | |
RENAME TABLE | |
`friends` TO `__friends_pre_migration__`, | |
`friends_shadow` TO `friends` | |
; | |
DROP TRIGGER IF EXISTS `insert_friends_shadow`; | |
DROP TRIGGER IF EXISTS `update_friends_shadow`; | |
DROP TRIGGER IF EXISTS `delete_friends_shadow`; | |
RENAME TABLE | |
`friends` TO `friends_shadow`, | |
`__friends_pre_migration__` TO `friends` | |
; | |
DROP TABLE IF EXISTS friends, friends_shadow, __friends_pre_migration__; | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment