如何增加数据库中的每个外键?

时间:2011-05-19 15:09:05

标签: mysql

我有两个大型MySQL数据库,我想要合并相同的模式。为此,我希望将一个数据库的每个外键(和id,自然地)增加1000万,然后将修改后的db的所有记录插入到另一个数据库中。

我曾考虑使用grepgawk等工具编辑mysqldump,但这似乎很难做到。什么是最好的方法?

3 个答案:

答案 0 :(得分:1)

UPDATE TABLE mytable_foreign SET ID = ID + 10000000;
UPDATE TABLE mytable SET FOREIGN_ID = FOREIGN_ID + 10000000;

在旧DB中:

  • 删除ID和外部ID的约束
  • 更新数据(使用上面的查询)
  • 仅将数据备份为INSERT语句

在新数据库中:

  • 插入备份文件

答案 1 :(得分:1)

将两个数据库转储到同一服务器中。一个将是目标计划。

  • 将数据库1转储到final_scheme
  • 将数据库2转储到aux_scheme

为每张桌子做这件事(我希望这并不困难):

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