我有一个 MySQL 程序来从表中导出一些内容。当我编写它时,它运行得很好,但现在当我想重新执行它时,它会运行多次。
这是我的程序:
DELIMITER //
CREATE PROCEDURE count_null(IN tbl_name VARCHAR(255))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE col_name VARCHAR(255);
DECLARE col_type VARCHAR(50);
DECLARE cur CURSOR FOR
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = tbl_name; -- Use a different name for parameter
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO col_name, col_type;
IF done THEN
LEAVE read_loop;
END IF;
SET @where_clause = '';
IF col_type = 'date' THEN
SET @where_clause = CONCAT(col_name, ' IS NULL');
ELSE
SET @where_clause = CONCAT(col_name, ' IS NULL OR ', col_name, ' = ""');
END IF;
SET @sql = CONCAT('SELECT ', QUOTE(col_name), ' AS column_name, COUNT(*) AS count FROM ', tbl_name, ' WHERE ', @where_clause, ';');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
END//
DELIMITER ;
我运行它:
CALL count_null('TABLENAME');
其输出是这样的:
+--------------+-------+
| column_name | count |
+--------------+-------+
| baltimore_id | 0 |
+--------------+-------+
1 row in set (0.00 sec)
+---------------+-------+
| column_name | count |
+---------------+-------+
| molecule_type | 0 |
+---------------+-------+
1 row in set (0.00 sec)
+--------------+-------+
| column_name | count |
+--------------+-------+
| baltimore_id | 0 |
+--------------+-------+
1 row in set (0.00 sec)
+---------------+-------+
| column_name | count |
+---------------+-------+
| molecule_type | 0 |
+---------------+-------+
1 row in set (0.00 sec)
+--------------+-------+
| column_name | count |
+--------------+-------+
| baltimore_id | 0 |
+--------------+-------+
1 row in set (0.00 sec)
+---------------+-------+
| column_name | count |
+---------------+-------+
| molecule_type | 0 |
+---------------+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
此外,工作台的日志显示该过程执行了多次。
如何解决/防止这个问题? (ps. 对于那些没有仔细阅读问题的人,我知道输出,就可以了!只需将程序执行限制为一个周期即可。)
终于找到了。这不是由于环境变量造成的。我从 [MySQL 8.0.36] 切换到旧版本 [MySQL 8.0.204],它现在可以工作了。我不知道这两者有什么区别,但现在很好。