清除外部检查失败的 MySQL 个表
Clean MySQL tables with failed foreign checks
我有一个巨大的 mysql sql 转储文件。但是由于外键检查,当我尝试导入它时出现错误。不知何故缺少数据,所以我用
导入它
SET SESSION FOREIGN_KEY_CHECKS=0;
它有效,但我正在寻找丢失数据的解决方案。
那么有没有任何自动方法来查找和删除包含缺失条目的关系数据以获得干净的数据库转储,或者我必须去为每个关系编写 manuel SQL,编写查询以删除缺失值?
您可以像这样自动执行删除语句:
DELIMITER $$
DROP PROCEDURE IF EXISTS check_foreign $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `check_foreign`()
BEGIN
DECLARE finishing INTEGER DEFAULT 0;
DECLARE vstmt VARCHAR(4000);
DECLARE vtbname VARCHAR(50);
DECLARE vtbnameref VARCHAR(50);
DECLARE vtbcol VARCHAR(50);
DECLARE vtbcolref VARCHAR(50);
DECLARE cr_tables CURSOR FOR select a.table_name, a.referenced_table_name, a.column_name, a.referenced_column_name from information_schema.KEY_COLUMN_USAGE a where a.table_schema = 'protocol_manager' and a.REFERENCED_TABLE_NAME is not null order by a.table_name;
DECLARE CONTINUE HANDLER FOR not found SET finishing = 1;
OPEN cr_tables;
SET vstmt = '';
table_foreign_delete: loop
if finishing = 1 then
leave table_foreign_delete;
end if;
FETCH cr_tables INTO vtbname, vtbnameref, vtbcol, vtbcolref;
SET vstmt = CONCAT(vstmt, char(10), 'DELETE FROM ', vtbname, ' a WHERE NOT EXISTS (SELECT 1 FROM ', vtbnameref, ' b WHERE a.', vtbcol, ' = b.', vtbcolref, ');');
end loop table_foreign_delete;
select vstmt;
END$$
DELIMITER ;
您甚至可以进行深入搜索以找到动态执行它的方法。例如,带有触发器的临时 table。您生成一个删除语句,将其插入临时 table,触发触发另一个 (func, proc) 的插入以执行生成的语句。
我有一个巨大的 mysql sql 转储文件。但是由于外键检查,当我尝试导入它时出现错误。不知何故缺少数据,所以我用
导入它SET SESSION FOREIGN_KEY_CHECKS=0;
它有效,但我正在寻找丢失数据的解决方案。
那么有没有任何自动方法来查找和删除包含缺失条目的关系数据以获得干净的数据库转储,或者我必须去为每个关系编写 manuel SQL,编写查询以删除缺失值?
您可以像这样自动执行删除语句:
DELIMITER $$
DROP PROCEDURE IF EXISTS check_foreign $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `check_foreign`()
BEGIN
DECLARE finishing INTEGER DEFAULT 0;
DECLARE vstmt VARCHAR(4000);
DECLARE vtbname VARCHAR(50);
DECLARE vtbnameref VARCHAR(50);
DECLARE vtbcol VARCHAR(50);
DECLARE vtbcolref VARCHAR(50);
DECLARE cr_tables CURSOR FOR select a.table_name, a.referenced_table_name, a.column_name, a.referenced_column_name from information_schema.KEY_COLUMN_USAGE a where a.table_schema = 'protocol_manager' and a.REFERENCED_TABLE_NAME is not null order by a.table_name;
DECLARE CONTINUE HANDLER FOR not found SET finishing = 1;
OPEN cr_tables;
SET vstmt = '';
table_foreign_delete: loop
if finishing = 1 then
leave table_foreign_delete;
end if;
FETCH cr_tables INTO vtbname, vtbnameref, vtbcol, vtbcolref;
SET vstmt = CONCAT(vstmt, char(10), 'DELETE FROM ', vtbname, ' a WHERE NOT EXISTS (SELECT 1 FROM ', vtbnameref, ' b WHERE a.', vtbcol, ' = b.', vtbcolref, ');');
end loop table_foreign_delete;
select vstmt;
END$$
DELIMITER ;
您甚至可以进行深入搜索以找到动态执行它的方法。例如,带有触发器的临时 table。您生成一个删除语句,将其插入临时 table,触发触发另一个 (func, proc) 的插入以执行生成的语句。