開発サーバー上のデータベーステーブルをライブサーバーと比較し、列名の変更、新しい列、および削除された列を探しています。私はこのようなことをしたいです:
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番目のデータベースには存在しない列のリストです。完璧!
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です。
それが他の誰かを助けることを願っています。よろしく。 :)
INFORMATION_SCHEMA
を使用する必要があります。
information_schema.columns
テーブルを各データベースから共有スキーマにコピーしてから、SQLクエリを実行してそれらを比較できます。