MySQL:仅复制外键

时间:2018-01-05 17:54:54

标签: mysql foreign-keys export

我最近将一个数据库复制到一个开发实例,在做了大量工作后意识到它已经错过了原始数据库的外键约束。索引包括在内。我可以从原始数据库创建一个导出脚本,包含外键吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

首先,我问为什么它没有在您的开发实例上创建外键?您是否将表创建为MyISAM表? MyISAM不支持外键,因此即使您可以隔离正确的定义,您也无法创建它们。

您可以使用mysqldbcompare标识所需的更改,这是免费MySQL Utilities中提供的工具。

例如,我创建了一个test数据库,其中包含一个表foo和一个子表bar,其外键引用了foo。我将test数据库复制到test2数据库(仍在localhost上)。然后我把外键放在test2.bar表中,所以有区别。

我可以使用mysqldbcompare来检测这种差异,并输出所需的ALTER TABLE来重新创建外键:

mysqldbcompare 
  --server1=root:password@localhost 
  --server2=root:password@localhost 
  --difftype=sql 
  --run-all-tests 
  --changes-for=server2 
  test:test2 

就我而言,两个数据库都在我的localhost实例上,但它们可能位于不同的服务器上。我只需在--server1--server2选项中指定服务器。

--difftype=sql表示输出SQL语句以使两个数据库同步。 --changes-for=server2表示我希望server2更改为匹配另一个。

test:test2命名要比较的数据库。如果他们在不同的服务器上,则他们可能都具有相同的数据库名称。

这是输出:

# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Checking databases test on server1 and test2 on server2
#
#                                                   Defn    Row     Data   
# Type      Object Name                             Diff    Count   Check  
# ------------------------------------------------------------------------- 
# TABLE     bar                                     FAIL    pass    -       
#           - Compare table checksum                                FAIL    
#           - Find row differences                                  pass    
#
# Transformation for --changes-for=server2:
#

ALTER TABLE `test2`.`bar` 
ADD CONSTRAINT bar_ibfk_1 FOREIGN KEY(foo_id) REFERENCES `test`.`foo`(id);


# TABLE     foo                                     pass    pass    -       
#           - Compare table checksum                                FAIL    
#           - Find row differences                                  pass   

# Database consistency check failed.
#
# ...done

看起来它会尝试创建FK以引用旧数据库名称test。如果我使用它,它就不会做我想要的,所以在运行之前我必须编辑它。如果您正在比较不同服务器上的副本,可能数据库名称没有变化,因此它可以正常工作。

默认情况下,它还会比较每个表中的数据,但有一些选项可以跳过这些测试。

阅读文档以获取更多信息:https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysqldbcompare.html