基本上我有一个已经填充了大约300万行的表,我需要知道每列的字符长度。考虑到该表中有138列,我如何在一个查询中获取这些值? 结果将是这样的:
+----------+-----------------+---------------|
| col_name | min_char_length |max_char_length|
+----------+-----------------+---------------|
| col1 | 10 | 20 |
+----------+-----------------+---------------|
| col2 | 1 | 15 |
+----------+-----------------+---------------|
提前告诉你。
答案 0 :(得分:0)
我不知道任何直接方式,但您可以像这样生成查询问题。
SELECT CONCAT(GROUP_CONCAT(
CONCAT('(SELECT \'',COLUMN_NAME,'\' AS `column`, MAX(LENGTH(`',COLUMN_NAME,'`)) AS `max_length`, MIN(LENGTH(`',COLUMN_NAME,'`)) AS `min_length` ',
'FROM `',TABLE_SCHEMA,'`.`',TABLE_NAME, '`)')
SEPARATOR ' UNION ALL '), ';') AS sql_query
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name';
GROUP_CONCAT()返回的最长字符串默认为1024。因此,您需要增加此限制。
示例:
SET group_concat_max_len = 1024;
我希望我能帮到你。
答案 1 :(得分:0)
很高兴它有效。问题可能很简单但是看,你可以做什么以及如何做有不同的限制。这就是为什么解决方案不那么“漂亮”的原因。 为了防止您需要更频繁,更容易地运行它,另一种解决方案是创建存储过程。但是......你需要权限(漂亮的部分)
# Use this just for testing, to recreate after making changes
DROP PROCEDURE IF EXISTS getColumns;
这使用与上面相同的解决方案,使用UNOIN创建多个查询并执行它们返回结果集。 另一种方法是创建一个临时表,插入每个SELECT的结果,然后,最后,对所有记录执行选择,但它可能不会那么快。
DELIMITER //
CREATE PROCEDURE getColumns
(IN db_name CHAR(20), IN tbl_name CHAR(20))
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE col_name VARCHAR(255);
DECLARE sql_query TEXT DEFAULT '';
# Get all columns and use a cursor to loop through them
DECLARE cursor_name CURSOR FOR
SELECT column_name FROM information_schema.columns
WHERE table_schema = db_name AND table_name = tbl_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
OPEN cursor_name;
read_columns: LOOP
# Concatenate a query for each column
FETCH cursor_name INTO col_name;
SET sql_query = CONCAT(sql_query, 'SELECT \'', col_name, '\' col_name', ', MIN(LENGTH(', col_name, ')) min_char_length, MAX(LENGTH(', col_name, ')) max_char_length FROM ', db_name, '.', tbl_name, IF(finished, '', ' UNION '));
IF finished THEN
LEAVE read_columns;
END IF;
END LOOP;
CLOSE cursor_name;
# Prepare & execute
SET @sql = sql_query;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
在这里,我们用数据库/表名称
调用该过程CALL getColumns('database', 'table')