mysql保留元数据的情况下修改表结构
环境介绍: 假设 有数据库AA 内部有表A,B
A.id 是 主键 int 自增型
B.b_id 是外键 关联的 A.id
问题:目前有多个数据库AA的DB服务器,但是内部的数据是不同的,想要合并这几个数据的数据,同事修改掉 以前的 int 自增型主键 为 varchar(255)的字符型。不能丢失元数据
需求:
1.在保证数据完整的前提下,将每个表的int自增主键 修改为 varchar(255)
2.按照 保证唯一性的算法 update 所有表的 主键, 从表 外键相应改变
解决步骤:
1.修改字段名,类型,1.通过手动 修改sql文件实现(目前只需要写sed 命令修改
`id` int(11) NOT NULL AUTO_INCREMENT 为 “guid” varchar(255) not null ;
PRIMARY KEY (`id`) 改为 PRIMARY KEY (`guid`);
对应的其他表的 外键类型 也要改为 varchar(255);
FOREIGN KEY (`group_id`) REFERENCES `auth_group` (
`id`) 改为 guid
)
2.update 数据 从表自动更新,通过修改sql文件中的外键约束设置update cascade 设置为级联即可。(目前只需要sed 命令修改所有的 update on action 改为 update cascade )
资料:
外键约束:
foreign key options[restrict(限制),cascade(级联),set null, no action]
【
外键约束对子表的含义:
如果在父表中找不到候选键,则不允许在子表上进行insert/update
外键约束对父表的含义:
在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句,
InnoDB支持5种方式, 分列如下 :
cascade方式
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
On delete cascade从
mysql3.23.50开始可用; on update cascade从mysql4.0.8开始可用
set null方式
在父表上update/delete记录时,将子表上匹配记录的列设为null
要注意子表的外键列不能为not null
On delete set null从mysql3.23.50开始可用; on update set null从mysql4.0.8开始可用
No action方式
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
这个是ANSI SQL-92标准,从mysql4.0.8开始支持
Restrict方式
同no action, 都是立即检查外键约束
】