使用大型數(shù)據(jù)庫時(shí),您可能會(huì)發(fā)現(xiàn)自己需要在多個(gè)表和列中查找特定值。這可能是一項(xiàng)具有挑戰(zhàn)性的任務(wù),尤其是當(dāng)您不知道到底該去哪里查看時(shí)。幸運(yùn)的是,有一些方法可以在 postgresql 和 mysql 中自動(dòng)執(zhí)行此搜索。
在 postgresql 中搜索數(shù)據(jù)
postgresql 允許高級(jí)過程語言功能,這在此類場(chǎng)景中非常有用。下面,我們將創(chuàng)建一個(gè) pl/pgsql 塊,用于在 postgresql 數(shù)據(jù)庫中的所有表和列中搜索特定值。
分步指南:
-
創(chuàng)建 pl/pgsql 塊:
以下 pl/pgsql 塊將在公共模式內(nèi)所有類型為字符變化、文本或 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 $$;
登錄后復(fù)制
-
說明:
聲明變量:我們聲明變量來保存我們的搜索文本和動(dòng)態(tài)查詢。
循環(huán)列: 我們循環(huán)遍歷公共模式中類型為字符變化、文本或 uuid 的每一列。
構(gòu)造并執(zhí)行查詢: 對(duì)于每一列,我們構(gòu)造一個(gè)動(dòng)態(tài) sql 查詢來檢查該列是否包含搜索文本。
發(fā)出通知: 如果找到搜索文本,則會(huì)發(fā)出帶有該列位置的通知。
-
運(yùn)行區(qū)塊:
在 postgresql 查詢工具(例如 pgadmin、psql)中執(zhí)行上述塊。這將打印出找到指定值的位置。
在 mysql 中搜索數(shù)據(jù)
mysql 不支持 pl/pgsql 風(fēng)格的過程語言塊。但是,您可以通過手動(dòng)生成并運(yùn)行必要的查詢或使用 shell 腳本來實(shí)現(xiàn)類似的功能。
分步指南:
-
生成搜索查詢:
以下 sql 查詢將生成一個(gè)查詢列表,用于在指定數(shù)據(jù)庫中的所有類型為 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');
登錄后復(fù)制
將 your_database_name 替換為您數(shù)據(jù)庫的實(shí)際名稱。
-
手動(dòng)運(yùn)行生成的查詢:
復(fù)制上述查詢的輸出,它看起來像這樣:
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';
登錄后復(fù)制
在 mysql 客戶端中手動(dòng)執(zhí)行每個(gè)查詢。
-
使用 shell 腳本實(shí)現(xiàn)自動(dòng)化:
如果您有權(quán)訪問類 unix shell,則可以使用 shell 腳本自動(dòng)化該過程:
#!/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 替換為您的實(shí)際 mysql 用戶名、密碼和數(shù)據(jù)庫名稱。該腳本將生成必要的搜索查詢,然后執(zhí)行每個(gè)查詢并打印結(jié)果。</p>
<h3>
結(jié)論
</h3>
<p>無論您使用 postgresql 還是 mysql,您都可以通過利用 postgresql 中的過程語言塊或在 mysql 中生成和執(zhí)行動(dòng)態(tài)查詢,在數(shù)據(jù)庫中的所有表和列中高效搜索特定值。這些方法可以在管理大型數(shù)據(jù)集時(shí)為您節(jié)省大量時(shí)間和精力。</p>
<p>對(duì)于 postgresql,pl/pgsql 塊為自動(dòng)搜索提供了強(qiáng)大的解決方案。對(duì)于 mysql,雖然過程語言塊不可用,但手動(dòng)或通過 shell 腳本生成和運(yùn)行動(dòng)態(tài)查詢可以達(dá)到相同的結(jié)果。</p>
<p>通過利用這些技術(shù),您可以簡(jiǎn)化數(shù)據(jù)庫管理任務(wù)并快速找到所需的數(shù)據(jù)。</p>
登錄后復(fù)制






