web-dev-qa-db-ja.com

SHOWCOLUMNSの出力をコンマ区切りのリストにグループ化します

開発サーバー上のデータベーステーブルをライブサーバーと比較し、列名の変更、新しい列、および削除された列を探しています。私はこのようなことをしたいです:

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')

結果は、最初のデータベースに存在し、2番目のデータベースには存在しない列のリストです。完璧!

23
Chris Baker

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'

編集します。情報スキーマを使用すると、メタデータに対してクエリを実行できます。したがって、たとえば左結合を使用して、テーブル間のフィールドを比較することもできます。

編集します。こんにちはクリス。解決してよかったです。あなたが言ったように、それは異なるサーバーに関係しているので、あなたの問題はかなり異なっていました。同じサーバー上の2つの異なるデータベースの例を追加します。

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

明らかな結果は、table2ではなくtable1に存在するdobです。

それが他の誰かを助けることを願っています。よろしく。 :)

31
Nicola Cossu

INFORMATION_SCHEMAを使用する必要があります。

information_schema.columnsテーブルを各データベースから共有スキーマにコピーしてから、SQLクエリを実行してそれらを比較できます。

1
Ike Walker