Групповой вывод 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')
Результаты представляют собой список любых столбцов, которые существуют в первой базе данных, а не во второй. Отлично!
Ответы
Ответ 1
Взгляните на таблицу 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, который присутствует в таблице1, а не в таблице2.
Надеюсь, что это помогает кому-то другому. С уважением, ребята.:)
Ответ 2
Вы должны использовать INFORMATION_SCHEMA
.
Вы можете скопировать таблицу information_schema.columns
из каждой базы данных в общую схему и затем выполнить SQL-запросы для их сравнения.