我们正在清理 MySQL 数据库,并发现许多在 ENUM 列中包含空字符串(作为值)的行。 MySQL 有忽略此类错误的坏习惯,你知道。
因此,由于我们有数百张表,我想知道是否有办法找到哪些表存在此问题。欢迎涉及查询、过程或 phpMyAdmin 命令的解决方案。
提前致谢!
附注我的第一个问题在这里!耶!
最佳答案
因此,按照评论中的建议,我编写了一个程序,用空字符串而不是 ENUM 值来打印表名、列名和行数。
它适用于 mysql 终端应用程序,但不适用于 phpMyAdmin。
USE __DATABASE_NAME_HERE__;
DELIMITER //
DROP PROCEDURE IF EXISTS hunt //
CREATE PROCEDURE hunt()
BEGIN
DECLARE done INT DEFAULT false;
DECLARE current_table_name VARCHAR(255);
DECLARE current_column_name VARCHAR(255);
DECLARE my_cursor CURSOR FOR
SELECT table_name, column_name
FROM information_schema.columns
WHERE information_schema.columns.table_schema = "__DATABASE_NAME_HERE__" AND information_schema.columns.column_type LIKE "%ENUM%";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN my_cursor;
my_loop: LOOP
FETCH my_cursor INTO current_table_name, current_column_name;
IF done THEN
LEAVE my_loop;
END IF;
SET @sql = CONCAT(
' SELECT COUNT(*) as column_count, "', current_table_name, '" AS table_name, "', current_column_name, '" AS column_name',
' FROM ', current_table_name,
' WHERE `', current_column_name , '` = ""',
' HAVING column_count > 0'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DROP PREPARE stmt;
END LOOP;
CLOSE my_cursor;
END //
DELIMITER ;
CALL hunt();
关于mysql - 搜索 MySQL 中的哪些表包含带有空 ENUM 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21030191/