2011-03-03 200 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