我将开发服务器上的数据库表与实时服务器进行比较,查找列名称更改,新列和已删除的列。我想做这样的事情:
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')
结果是第一个数据库中存在但不存在于第二个数据库中的任何列的列表。完美!
答案 0 :(得分:22)
查看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
,显而易见的结果是在table1中而不是在table2中的dob。
希望它可以帮助别人。关心伙计们。 :)
答案 1 :(得分:1)
您应该使用INFORMATION_SCHEMA
。
您可以将每个数据库中的information_schema.columns
表复制到共享模式中,然后运行SQL查询来比较它们。