Skip to content

Instantly share code, notes, and snippets.

@jairovm
Last active September 13, 2016 14:42
Show Gist options
  • Save jairovm/98e0273c45fd16b0acd78a675e115c65 to your computer and use it in GitHub Desktop.
Save jairovm/98e0273c45fd16b0acd78a675e115c65 to your computer and use it in GitHub Desktop.
Playing aroung with mysql table migration without downtime
/*
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