将SHOW COLUMNS的输出分组为逗号分隔列表
问题描述:
我将开发服务器上的数据库表与实时服务器进行比较,查找列名更改,新列和删除的列。我想要做这样的事情:将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')
结果是第一个数据库中存在的任何列的列表,而不是第二个数据库中的列。完善!
答
看看在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中。
希望它可以帮助别人。问候家伙。 :)
答
您应该使用INFORMATION_SCHEMA
。
您可以将每个数据库中的information_schema.columns
表复制到共享模式,然后运行SQL查询来比较它们。
谢谢,艾克。尼克在你之前,但为你的答案+1,非常感谢! – 2011-03-03 21:24:17