用navicat进行mysql表结构同步
- 前言
- 新增一个列然后进行表结构同步
- 删除一个列然后进行表结构同步
- 把Int列转成TinyInt列,看数字溢出的情况下能不能表结构同步
- 总结
前言
从同事那边了解到还能用navicat进行表结构同步,他会在发布更新的时候,直接从测试环境导出全量表,然后和正式环境做表结构更新,这样在不改动数据的情况下就可以更新好正式环境而不是去一个个的写ALTER更新语句。避免了遗漏。
打算做几个测试
- 新增一个列然后进行表结构同步
- 删除一个列然后进行表结构同步
- 把Int列转成TinyInt列,看数字溢出的情况下能不能表结构同步
新增一个列然后进行表结构同步
准备一个测试表,我来试一试,弄2个库,再弄2条数据
CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4;
CREATE DATABASE prod DEFAULT CHARACTER SET utf8mb4;
CREATE TABLE user (
`id` INT PRIMARY KEY,
`name` VARCHAR(16),
`age` INT
) ENGINE InnoDB;
INSERT INTO user VALUES (1, "小明", 13),(2,"小红", 99);
然后再更新test库
ALTER TABLE `user` DROP COLUMN `desc`;
ALTER TABLE `user` ADD COLUMN `desc` VARCHAR(256) NOT NULL DEFAULT "";
然后进行表结构同步
看到sql比较很准确,点击执行就可以了
删除一个列然后进行表结构同步
把test库里user的desc列删掉
ALTER TABLE `user` DROP COLUMN `desc`;
然后进行表结构同步
看的到也执行正确
把Int列转成TinyInt列,看数字溢出的情况下能不能表结构同步
把prod表中小红的age改成999999
UPDATE `user` SET COLUMN age=999999 WHERE `id`=2;
然后把test库中user表的age类型改成tinyInt
ALTER TABLE `user` MODIFY COLUMN `age` TINYINT;
然后再进行sql结构同步
sql语句怎么是这样的?AFTER是什么?
SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE `prod`.`user` MODIFY COLUMN `age` tinyint NULL DEFAULT NULL AFTER `name`;
SET FOREIGN_KEY_CHECKS=1;
执行之后发现出错了,表结构修改不成功
然后把prod里user表里,小红的age改成9,再试一遍,成功了
也就是在数据溢出的情况下,表结构不能更改。
总结
表结构同步可以很方便的得到我们需要的变更sql语句,这样在更新包的时候,就方便了,但是这个方法在实际工作中有人用过,有人从没用过,所以,和同事协作的时候,最好给别人发sql时发增量sql,而不是导全表,然后让别人做sql结构同步,因为别人很可能会把sql直接执行掉,而navicat导出的全表结构都是带drop if exists的,会把正式环境的表删掉的,就有人把这个删掉过,因为沟通没沟通好,一边发了全量sql,另一边的同事执行了这个sql导致正式环境库被清了。很倒霉。