我有两个大型MySQL数据库,我想要合并相同的模式。为此,我希望将一个数据库的每个外键(和id,自然地)增加1000万,然后将修改后的db的所有记录插入到另一个数据库中。
我曾考虑使用grep
和gawk
等工具编辑mysqldump,但这似乎很难做到。什么是最好的方法?
答案 0 :(得分:1)
UPDATE TABLE mytable_foreign SET ID = ID + 10000000;
UPDATE TABLE mytable SET FOREIGN_ID = FOREIGN_ID + 10000000;
在旧DB中:
在新数据库中:
答案 1 :(得分:1)
将两个数据库转储到同一服务器中。一个将是目标计划。
为每张桌子做这件事(我希望这并不困难):
insert into final_scheme.tableA
select id+1000000, name, etc, fk_id+1000000 from aux_scheme.tableA
我这是为了部分合并(这只是一些表)并且工作正常。
答案 2 :(得分:0)
好的,这是我使用information_schema
和bash脚本实现的解决方案。首先,我获取数据库中的每个键列及其出现的表,然后我更新每个列。
echo Incrementing every primary and foreign key by $increment
# Get the table name and column name for every key from the information_schema
select_constraints_sql="select TABLE_NAME, COLUMN_NAME from KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA = 'MyDB'"
# Place the query results in an array
data=( $(mysql -e "$select_constraints_sql" -sN --user=$username --password=$passwd information_schema) )
# Step through the tables and keys and update each, with foreign key checks disabled
# Foreign key checks must be disabled at each step
ignore_fks_sql="SET FOREIGN_KEY_CHECKS = 0"
cnt=${#data[@]}
for (( i=0 ; i < cnt ; i=i+2 ))
do
update_key_sql="$ignore_fks_sql; UPDATE ${data[$i]} SET ${data[$i+1]} = ${data[$i+1]} + $increment"
mysql -v -e "$update_key_sql" --user=$username --password=$passwd MyDB
done
# This is just me being a bit pedantic
check_fks_sql="SET FOREIGN_KEY_CHECKS = 1"
mysql -v --user=$username --password=$passwd -e "$check_fks_sql" MyDB