Uma tarefa um tanto quanto chata de ser realizada é fazer um delete em uma tabela em um registro que possui filhos(ou dependência, como preferir) e que na criação da Foreign Key não é definido a opção ON DELETE CASCADE. Então você irá tentar apagar e irá aparecer essa mensagem de erro:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails...

Isso significa que para que seja possível apagar o registro desejado, antes será necessário apagar os filhos desse registro.

Nesse momento que bate aquela tristeza enorme, pois você não tem o MER e terá que olhar várias até achar os filhos.

Para ajudar nesse processo eu desenvolvi essa procedure que lista as tabelas que possuem filhos(apenas as tabelas que possuem filhos, pode ser que exista um FK mas a tabela não possui nenhum filho, nesse caso não irá apresentar como resultado) de um registro.

DELIMITER $
CREATE PROCEDURE sp_getDataDependency(_P_DB_ VARCHAR(64), _P_TABLE_ VARCHAR(64), _P_VALUE_ VARCHAR(200))
BEGIN
 -- This procedure returns the dependencies of a table
 -- The dependencias are checked by FOREIGN KEYS
 -- Contacts: Diego Hellas/diegohellas@gmail.com
 -- 2015-06-23
 -- _P_DB_: Database name
 -- _P_TABLE_: Table name
 -- _P_VALUE_: Value to be checked
 DECLARE v_constratint VARCHAR(64);
 DECLARE v_table VARCHAR(64);
 DECLARE v_FK_name VARCHAR(64);
 DECLARE v_FK_table_name VARCHAR(64);
 DECLARE v_finished INTEGER DEFAULT 0;
 DECLARE cursor_childrens CURSOR FOR SELECT CONSTRAINT_NAME, TABLE_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = _P_DB_ AND REFERENCED_TABLE_NAME = _P_TABLE_;
 DECLARE cursor_references CURSOR FOR SELECT COLUMN_NAME, TABLE_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA = _P_DB_ AND TABLE_NAME = @v_table AND CONSTRAINT_NAME = @v_constratint;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;
 SELECT DATABASE() INTO _P_DB_;
 SET @v_query = CONCAT('DROP TABLE IF EXISTS getDataDependency'); 
 PREPARE dropTable from @v_query; 
 EXECUTE dropTable; 
 DEALLOCATE PREPARE dropTable;
 SET @v_query = CONCAT('CREATE TEMPORARY TABLE getDataDependency(TABLE_NAME VARCHAR(64), COLUMN_NAME VARCHAR(64))'); 
 PREPARE createTable from @v_query; 
 EXECUTE createTable; 
 DEALLOCATE PREPARE createTable;
 OPEN cursor_childrens;
 cursor_childrens: LOOP
 FETCH cursor_childrens INTO v_constratint, v_table;
 IF v_finished = 1 THEN 
 LEAVE cursor_childrens;
 END IF;
 SET @v_constratint = v_constratint;
 SET @v_table = v_table;
 -- --------------------------------
 OPEN cursor_references;
 cursor_references: LOOP
 FETCH cursor_references INTO v_FK_name, v_FK_table_name;
 SET @qtyResults = 0;
 SET @v_query = CONCAT('SELECT COUNT(*) FROM ', _P_DB_ , '.' , v_FK_table_name , ' WHERE ', v_FK_name, ' = ', _P_VALUE_ , ' INTO @qtyResults'); 
 PREPARE selectTable from @v_query; 
 EXECUTE selectTable; 
 DEALLOCATE PREPARE selectTable; 
 IF @qtyResults > 0 THEN 
 SET @v_query = CONCAT('INSERT INTO getDataDependency(TABLE_NAME, COLUMN_NAME) VALUES("', v_FK_table_name ,'", "', v_FK_name ,'")'); 
 PREPARE insertTable from @v_query; 
 EXECUTE insertTable; 
 DEALLOCATE PREPARE insertTable; 
 END IF;
 LEAVE cursor_references;
 END LOOP cursor_references;
 CLOSE cursor_references;
 -- ---------------------------------
 END LOOP cursor_childrens;
 CLOSE cursor_childrens;
 SELECT * FROM getDataDependency;
END$
DELIMITER ;

Como usar:

call sp_getDataDependency(‘Database name’, ‘Table name’, ‘PK_value’);

Isso irá me ajudar muito, espero que ajude vocês também.

Abraço

 

Isso não é um tarefa normal muito menos rotineira. Porém volta e meia me deparo com situações onde eu ou colegas necessitam localizar algum valor no MySQL, porém sem fazer ideia de em qual tabela se encontra.
Para isso desenvolvi essa procedure.
Ela se encarrega de procurar algum valor em todas as colunas de todas.

Use com moderação, pois dependendo da quantidade de dados que você tiver, pode afetar o desempenho do servidor.

DELIMITER $
CREATE PROCEDURE sp_searchValueInDB(_P_VALUE_ varchar(100), _P_DB_ varchar(64), _P_TYPE_ ENUM('char', 'numeric', 'date'))
BEGIN
 -- This procedure performs searches in all columns of a database.
 -- The execution performance will depend greatly on the size of your database.
 -- Contacts: Diego Hellas/diegohellas@gmail.com
 -- 2014-10-13
 -- _P_VALUE_: what is sought
 -- _P_DB_: Database name for search
 -- _P_TYPE_: Type of data that will be fetched, it helps reduce the columns to be searched, which makes it faster.
 DECLARE v_collumn VARCHAR(64);
 DECLARE v_table VARCHAR(64);
 DECLARE v_query VARCHAR(500);
 DECLARE v_finished INTEGER DEFAULT 0;
 DECLARE cursor_collumns CURSOR FOR SELECT COLUMN_NAME, TABLE_NAME FROM tmp_collumns;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

 -- Drop tmp table if exists
 SET @v_query = CONCAT('DROP TABLE IF EXISTS tmp_collumns'); 
 PREPARE dropTable from @v_query; 
 EXECUTE dropTable; 
 DEALLOCATE PREPARE dropTable; 

 -- Cretae tmp table for the CURSOR use
 SET @v_query = CONCAT('CREATE TABLE tmp_collumns (COLUMN_NAME varchar(64), TABLE_NAME varchar(64))'); 
 PREPARE createTable from @v_query; 
 EXECUTE createTable; 
 DEALLOCATE PREPARE createTable; 
 
 -- Select only the types of expected columns
 IF _P_TYPE_ = 'char' THEN
 INSERT INTO tmp_collumns SELECT COLUMN_NAME, TABLE_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = _P_DB_ AND DATA_TYPE IN("CHAR", "VARCHAR", "BINARY", "VARBINARY", "BLOB", "TEXT", "TINYTEXT" , "ENUM", "SET");
 END IF;
 IF _P_TYPE_ = 'numeric' THEN
 INSERT INTO tmp_collumns SELECT COLUMN_NAME, TABLE_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = _P_DB_ AND DATA_TYPE IN("tinyint", "smallint" "mediunint", "int", "bigint", "decimal", "bit", "double", "float");
 END IF;
 IF _P_TYPE_ = 'date' THEN
 INSERT INTO tmp_collumns SELECT COLUMN_NAME, TABLE_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = _P_DB_ AND DATA_TYPE IN("DATE","TIME", "DATETIME", "TIMESTAMP", "YEAR");
 END IF;

 
 -- CURSOR LOOP
 OPEN cursor_collumns;
 cursor_collumns: LOOP
 FETCH cursor_collumns INTO v_collumn, v_table;
 SET @qtyResults = 0;
 IF v_finished = 1 THEN 
 LEAVE cursor_collumns;
 END IF;
 set @v_query=concat('SELECT COUNT(*) FROM ', v_table, ' WHERE ', v_collumn, ' LIKE "%', _P_VALUE_, '%" INTO @qtyResults'); 
 prepare searchValueQuery from @v_query;
 execute searchValueQuery;
 IF @qtyResults > 1 THEN 
 SELECT v_table, v_collumn, @qtyResults;
 END IF;
 DEALLOCATE PREPARE searchValueQuery;
 END LOOP cursor_collumns;
 CLOSE cursor_collumns;


 -- Drop tmp table if exists
 SET @v_query = CONCAT('DROP TABLE IF EXISTS tmp_collumns'); 
 PREPARE dropTable from @v_query; 
 EXECUTE dropTable; 
 DEALLOCATE PREPARE dropTable; 
END$
DELIMITER ;

Após criar a procedure, basta fazer bom uso.
Ex: call sp_searchValueInDB(‘meu_db’, ‘admin’, ‘char’);

Aulas ao vivo sem que você precise sair de casa.