我最近将一个数据库复制到一个开发实例,在做了大量工作后意识到它已经错过了原始数据库的外键约束。索引包括在内。我可以从原始数据库创建一个导出脚本,仅包含外键吗?
提前致谢!
答案 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