2011-03-03 101 views
12

我将开发服务器上的数据库表与实时服务器进行比较,查找列名更改,新列和删除的列。我想要做这样的事情:将SHOW COLUMNS的输出分组为逗号分隔列表

SELECT GROUP_CONCAT(Field) FROM (SHOW COLUMNS ON table_name) GROUP BY Field 

我所追求的是一个逗号分隔的列表,我可以再取到实时服务器,并做到:

SHOW COLUMNS FROM table_name WHERE NOT IN ([comma-delimited list from above query]) 

如何有什么想法最好做到这一点 - 要么以我自己的方式纠正我,要么通过其他方式一起纠正?显然,上述SQL不起作用。

备注:服务器完全独立,可能无法相互通信,因此不可能进行直接比较。


编辑

感谢您的答案,伙计们!运用你的问题的答案,这是我最后的SQL得到的列名:

SELECT CONCAT("'", GROUP_CONCAT(column_name ORDER BY ordinal_position SEPARATOR "', '"), "'") AS columns 
FROM information_schema.columns 
WHERE table_schema = 'db_name' AND table_name = 'tbl_name' 

这让我看起来像这样的列表:

'id', 'name', 'field1', 'field2' 

那么我可以用这个查询比较:

SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position) 
FROM information_schema.columns 
WHERE table_schema = 'db_name' AND table_name = 'tbl_name' AND column_name NOT IN ('id', 'name', 'field1', 'field2') 

结果是第一个数据库中存在的任何列的列表,而不是第二个数据库中的列。完善!

回答

16

看看在INFORMATION_SCHEMA.COLUMNS表

select group_concat(column_name order by ordinal_position) 
from information_schema.columns 
where table_schema = 'database_name' and table_name = 'table_name' 

编辑。信息架构允许您对元数据进行查询。 因此,您甚至可以比较左连接表之间的字段。

编辑。嗨克里斯。很高兴你解决了。正如你所说的,你的问题与其他服务器有关,因此它有很大的不同。我在同一台服务器上添加了两个不同数据库的示例。

create database db1; 
use db1; 
create table table1(
id int not null auto_increment primary key, 
name varchar(50), 
surname varchar(50), 
dob date) 
engine = myisam; 

create database db2; 
create table db2.table2 like db1.table1; 
alter table db2.table2 drop column dob; 

select i1.column_name from (
select column_name 
from information_schema.columns 
where table_schema = 'db1' and table_name = 'table1') as i1 
left join (
select column_name 
from information_schema.columns 
where table_schema = 'db2' and table_name = 'table2') as i2 
on i1.column_name = i2.column_name 
where i2.column_name is null 

并且显而易见的结果是dob存在于table1中而不是在table2中。

希望它可以帮助别人。问候家伙。 :)

1

您应该使用INFORMATION_SCHEMA

您可以将每个数据库中的information_schema.columns表复制到共享模式,然后运行SQL查询来比较它们。

+0

谢谢,艾克。尼克在你之前,但为你的答案+1,非常感谢! – 2011-03-03 21:24:17