Mysql
是否可以執行查詢來定位哪個表包含單列中包含超過 100 萬個字元的行?
我們有一個包含 701 個表的 MySQL 數據庫。我正在嘗試使用數據管道工具將這個 MySQL 數據庫複製到我們的數據倉庫 Snowflake 中。不幸的是,管道工具遇到錯誤,因為其中一個表中的一條記錄包含單行,單列中包含超過 100 萬個字元。
我試圖找出是否有一個我可以使用的查詢來查看每個表,以確定哪一行有這個違規記錄。這有可能做到嗎?
奇怪的是,管道工具沒有提供更多關於哪個表/列的上下文。
information_schema.COLUMNS包含一個
CHARACTER_MAXIMUM_LENGTH
並且CHARACTER_MAXIMUM_LENGTH
可以指示哪些表列可以儲存 1MB 的數據。之後,您需要查詢所有可能的表。
如果有更短的方法可以做到這一點,我不知道。
基於@danblack 的答案,您將創建一個可能包含如此長數據的表列表。這可能會返回 701 表的一個子集。即不是所有的表都有一個可以包含這麼長數據的列。
然後用於
MAX(CHAR_LENGTH(<column>))
獲取該表中任何行的最大長度。每個表需要一個查詢,因為您可以在每個查詢中放置多個聚合表達式。事實上,您可以使用 INFORMATION_SCHEMA 查詢來格式化您需要的查詢:
SELECT CONCAT( 'SELECT ', GROUP_CONCAT(CONCAT('MAX(CHAR_LENGTH(`',COLUMN_NAME,'`)) AS `MAX_',COLUMN_NAME,'_LENGTH`')), ' FROM `',TABLE_SCHEMA,'`.`',TABLE_NAME,'`;') AS _query FROM INFORMATION_SCHEMA.COLUMNS WHERE CHARACTER_MAXIMUM_LENGTH >= 1000000 AND TABLE_SCHEMA NOT IN ('mysql','sys','performance_schema','information_schema') GROUP BY TABLE_SCHEMA, TABLE_NAME;
結果是一組字元串,它們本身就是您可以執行的 SQL 查詢,每個表一個。