我有一组InnoDB
表,我需要通过删除一些行和插入其他行来定期维护这些表。有几个表具有引用其他表的外键约束,因此这意味着表加载顺序很重要。为了插入新行而不必担心表的顺序,我用途:
SET FOREIGN_KEY_CHECKS=0;
字符串
之前,然后:
SET FOREIGN_KEY_CHECKS=1;
型
之后。
加载完成后,我想检查更新后的表中的数据是否仍然保持引用完整性--新行是否没有破坏外键约束--但似乎没有办法做到这一点。
作为测试,我输入了我确信违反了外键约束的数据,在重新启用外键检查时,mysql没有产生任何警告或错误。
如果我试图找到一种方法来指定表加载顺序,并在加载过程中保持外键检查,这将不允许我在具有自引用外键约束的表中加载数据,因此这不是一个可接受的解决方案。
有没有办法强制InnoDB验证表或数据库的外键约束?
5条答案
按热度按时间nr9pn0ug1#
字符串
您可以使用这个存储程序来检查all数据库中是否有无效的外部索引键。结果将被加载到
INVALID_FOREIGN_KEYS
表中。ANALYZE_INVALID_FOREIGN_KEYS
的参数:1.数据库名称模式(LIKE样式)
1.表名模式(LIKE样式)
'Y'
、'N'
、NULL
。'Y'
,则ANALYZE_INVALID_FOREIGN_KEYS
结果表将是临时表。临时表对其他会话不可见。可以使用临时结果表并行执行多个ANALYZE_INVALID_FOREIGN_KEYS(...)
存储过程。'N'
,然后从其他会话执行SELECT * FROM INVALID_FOREIGN_KEYS;
。NULL
来跳过事务中的结果表创建,因为MySQL在事务中对CREATE TABLE ...
和DROP TABLE ...
执行隐式提交,因此结果表的创建会导致事务中出现问题。在这种情况下,您必须使用BEGIN; COMMIT/ROLLBACK;
块自行创建结果表:型
访问MySQL站点了解隐式提交:http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html
INVALID_FOREIGN_KEYS
行将只包含无效数据库、表、列的名称。但是,您可以在执行INVALID_FOREIGN_KEYS
的INVALID_KEY_SQL
列的值(如果有)时看到无效的引用行。如果引用列上有索引,则此存储过程的速度将非常快。外部索引)和引用的列(通常是主键)。
sqserrrh2#
谢谢你的回答-这是一个非常方便的工具。下面是该过程的一个稍微修改的版本,它在输出表中包含SQL以删除具有无效键的键-对于您已经确认这些行只是缺少/禁用删除级联规则的孤立行(而不是主键更改或其他更复杂情况下的孤立行)的情况很方便。
字符串
hmae6n7t3#
我修改了脚本来处理多列外键。
字符串
kkih6yb84#
没有工具可以做到这一点。但是你可以写一个脚本,它将遍历你所有的表,删除并重新创建外键约束。在重新创建时,如果出现错误,则会出现错误。
tyg4sfes5#
相同的检查,但用于无效的UNIQUE密钥分析:
--> * 小bug/功能 *:它也会报告重复的空值。(mysql允许重复的null)。
字符串