0

私は巨大なmysql sqlダンプファイルを持っています。しかし、私は外部キーチェックのためにインポートしようとするとエラーになります。どういうわけか、そこにデータが欠落しているので、私は外国のチェックで失敗したMySQLテーブルを清掃します

SET SESSION FOREIGN_KEY_CHECKS=0; 

でそれをインポートすることだし、それは動作しますが、私は、データの欠落のためのソリューションを探しています。

データベースのクリーンなダンプを取得するためのエントリが見つからないリレーションデータを自動的に見つけて削除する方法がありますか、またはすべてのリレーションに対してmanuel SQLを書き込んで、欠損値を削除するクエリを作成する必要がありますか?

+0

あなたは、あなたが 'FOREIGN_KEY_CHECKS =を忘れないでしょう掃除が終わったら0 '私は願っています:P – Drew

+0

それはセッション変数である。 – tanaydin

答えて

1

あなたはこのようなdelete文を自動化することができます。

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 ; 

あなたもdynamiclyそれを実行するための方法を見つけるために、深い検索を行うことができます。たとえば、トリガーを持つ一時テーブル。 deleteステートメントを生成し、tempテーブルに挿入し、生成されたステートメントを実行する別の(func、proc)を起動する挿入をトリガーします。

+0

さて私は、私は、この機能のためのマニュアル:)のおかげで、それをきれいにする必要があります、ということを理解します)。 – tanaydin

関連する問題