如何在MySQL中查找具有特定列名的所有表?

我有2-3个不同的列名,我想在整个数据库中查找并列出所有包含这些列的表。 任何简单的脚本?

要获取数据库YourDatabase中的列columnAColumnB所有表:

 SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('columnA','ColumnB') AND TABLE_SCHEMA='YourDatabase'; 
 SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%wild%'; 

更简单地在一行SQL中完成:

 SELECT * FROM information_schema.columns WHERE column_name = 'column_name'; 
 SELECT DISTINCT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name LIKE 'employee%' AND TABLE_SCHEMA='YourDatabase' 

在没有information_schema的版本(旧版本或某些ndb)中,您可以转储表结构并手动搜索列。

 mysqldump -h$host -u$user -p$pass --compact --no-data --all-databases > some_file.sql 

现在使用你喜欢的文本编辑器在some_file.sql搜索列名,或者使用一些漂亮的awk脚本。


而一个简单的sed脚本来查找列,只需将COLUMN_NAME替换为你的:

 sed -n '/^USE/{h};/^CREATE/{H;x;s/\nCREATE.*\n/\n/;x};/COLUMN_NAME/{x;p};' <some_file.sql USE `DATABASE_NAME`; CREATE TABLE `TABLE_NAME` ( `COLUMN_NAME` varchar(10) NOT NULL, 

您可以直接在sed中输出转储,但这是微不足道的。

对于那些搜索这个相反的,即查找不包含某个列名称的表,这里是查询…

 SELECT DISTINCT TABLE_NAME FROM information_schema.columns WHERE TABLE_SCHEMA = 'your_db_name' AND TABLE_NAME NOT IN (SELECT DISTINCT TABLE_NAME FROM information_schema.columns WHERE column_name = 'column_name' AND TABLE_SCHEMA = 'your_db_name'); 

当我们开始慢慢实施InnoDB的专栏,需要弄清楚我们200张桌子中有哪些还没有升级的时候,这真的很方便。

如果你想要“ 只得到所有表 ”,然后使用这个查询:

 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME like '%' and TABLE_SCHEMA = 'tresbu_lk' 

如果你想要“ 获取所有表与列 ”,然后使用此查询:

 SELECT DISTINCT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name LIKE '%' AND TABLE_SCHEMA='tresbu_lk' 

使用这一行查询,用你的列名替换desired_column_name。

 SELECT TABLE_NAME FROM information_schema.columns WHERE column_name = 'desired_column_name';