Подтвердить что ты не робот

Групповой вывод 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')

Результаты представляют собой список любых столбцов, которые существуют в первой базе данных, а не во второй. Отлично!

4b9b3361

Ответ 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-запросы для их сравнения.