使用大型數據庫時,您可能會發現自己需要在多個表和列中查找特定值。這可能是一項具有挑戰性的任務,尤其是當您不知道到底該去哪里查看時。幸運的是,有一些方法可以在 postgresql 和 mysql 中自動執行此搜索。
在 postgresql 中搜索數據
postgresql 允許高級過程語言功能,這在此類場景中非常有用。下面,我們將創建一個 pl/pgsql 塊,用于在 postgresql 數據庫中的所有表和列中搜索特定值。
分步指南:
-
創建 pl/pgsql 塊:
以下 pl/pgsql 塊將在公共模式內所有類型為字符變化、文本或 uuid 的列中搜索值“dcea8891-b4e1-45f8-8cb9-c8a164cb98ff”。
do $$ declare rec record; search_text text := 'dcea8891-b4e1-45f8-8cb9-c8a164cb98ff'; query text; begin for rec in select table_schema, table_name, column_name from information_schema.columns where table_schema = 'public' and data_type in ('character varying', 'text', 'uuid') loop query := 'select ''' || rec.table_schema || '.' || rec.table_name || '.' || rec.column_name || ''' as location, ' || rec.column_name || ' from ' || rec.table_schema || '.' || rec.table_name || ' where ' || rec.column_name || '::text = $1'; execute query using search_text into rec; if rec is not null then raise notice 'found in %', rec.location; end if; end loop; end $$;
登錄后復制
-
說明:
聲明變量:我們聲明變量來保存我們的搜索文本和動態查詢。
循環列: 我們循環遍歷公共模式中類型為字符變化、文本或 uuid 的每一列。
構造并執行查詢: 對于每一列,我們構造一個動態 sql 查詢來檢查該列是否包含搜索文本。
發出通知: 如果找到搜索文本,則會發出帶有該列位置的通知。
-
運行區塊:
在 postgresql 查詢工具(例如 pgadmin、psql)中執行上述塊。這將打印出找到指定值的位置。
在 mysql 中搜索數據
mysql 不支持 pl/pgsql 風格的過程語言塊。但是,您可以通過手動生成并運行必要的查詢或使用 shell 腳本來實現類似的功能。
分步指南:
-
生成搜索查詢:
以下 sql 查詢將生成一個查詢列表,用于在指定數據庫中的所有類型為 varchar、text 或 char 的列中搜索值“dcea8891-b4e1-45f8-8cb9-c8a164cb98ff”。
select concat('select ''', table_schema, '.', table_name, '.', column_name, ''' as location, ', column_name, ' from ', table_schema, '.', table_name, ' where ', column_name, ' = ''', 'dcea8891-b4e1-45f8-8cb9-c8a164cb98ff', ''';') as search_query from information_schema.columns where table_schema = 'your_database_name' and data_type in ('varchar', 'text', 'char');
登錄后復制
將 your_database_name 替換為您數據庫的實際名稱。
-
手動運行生成的查詢:
復制上述查詢的輸出,它看起來像這樣:
select 'your_database_name.table1.column1' as location, column1 from your_database_name.table1 where column1 = 'dcea8891-b4e1-45f8-8cb9-c8a164cb98ff'; select 'your_database_name.table2.column2' as location, column2 from your_database_name.table2 where column2 = 'dcea8891-b4e1-45f8-8cb9-c8a164cb98ff';
登錄后復制
在 mysql 客戶端中手動執行每個查詢。
-
使用 shell 腳本實現自動化:
如果您有權訪問類 unix shell,則可以使用 shell 腳本自動化該過程:
#!/bin/bash SEARCH_TEXT='dcea8891-b4e1-45f8-8cb9-c8a164cb98ff' DATABASE='your_database_name' USERNAME='your_username' PASSWORD='your_password' # Generate the search queries QUERIES=$(mysql -u $USERNAME -p$PASSWORD -D $DATABASE -N -e " SELECT CONCAT('SELECT ''', table_schema, '.', table_name, '.', column_name, ''' AS location, ', column_name, ' FROM ', table_schema, '.', table_name, ' WHERE ', column_name, ' = ''', '$SEARCH_TEXT', ''';') FROM information_schema.columns WHERE table_schema = '$DATABASE' AND data_type IN ('varchar', 'text', 'char');") # Execute each query while read -r QUERY; do mysql -u $USERNAME -p$PASSWORD -D $DATABASE -e "$QUERY" done <p>將 your_username、your_password 和 your_database_name 替換為您的實際 mysql 用戶名、密碼和數據庫名稱。該腳本將生成必要的搜索查詢,然后執行每個查詢并打印結果。</p> <h3> 結論 </h3> <p>無論您使用 postgresql 還是 mysql,您都可以通過利用 postgresql 中的過程語言塊或在 mysql 中生成和執行動態查詢,在數據庫中的所有表和列中高效搜索特定值。這些方法可以在管理大型數據集時為您節省大量時間和精力。</p> <p>對于 postgresql,pl/pgsql 塊為自動搜索提供了強大的解決方案。對于 mysql,雖然過程語言塊不可用,但手動或通過 shell 腳本生成和運行動態查詢可以達到相同的結果。</p> <p>通過利用這些技術,您可以簡化數據庫管理任務并快速找到所需的數據。</p>
登錄后復制