Выбрать все столбцы, кроме одного в MySQL? - PullRequest
333 голосов
/ 12 августа 2008

Я пытаюсь использовать оператор выбора, чтобы получить все столбцы из определенной таблицы MySQL, кроме одного. Есть ли простой способ сделать это?

РЕДАКТИРОВАТЬ: в этой таблице 53 столбца (НЕ МОЙ ДИЗАЙН)

Ответы [ 29 ]

2 голосов
/ 13 августа 2008

Хотя я согласен с ответом Томаса (+1;)), я бы хотел добавить предостережение о том, что столбец, который вы не хотите, содержит едва ли какие-либо данные. Если он содержит огромное количество текста, xml или двоичных двоичных объектов, найдите время, чтобы выбрать каждый столбец отдельно. Ваше выступление пострадает в противном случае. Ура!

2 голосов
/ 19 июля 2013

Может быть, у меня есть решение для Яна Коритака указал несоответствие

SELECT CONCAT('SELECT ',
( SELECT GROUP_CONCAT(t.col)
FROM
(
    SELECT CASE
    WHEN COLUMN_NAME = 'eid' THEN NULL
    ELSE COLUMN_NAME
    END AS col 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
) t
WHERE t.col IS NOT NULL) ,
' FROM employee' );

Таблица:

SELECT table_name,column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'

================================

table_name  column_name
employee    eid
employee    name_eid
employee    sal

================================

Результат запроса:

'SELECT name_eid,sal FROM employee'
2 голосов
/ 07 ноября 2011

Ответ, опубликованный Махомедалидом, имеет небольшую проблему:

Внутри кода функции замены была замена "<columns_to_delete>," на "", эта замена имеет проблему, если поле для замены является последним в строке concat, поскольку последнее не имеет запятой char ", "и не удаляется из строки.

Мое предложение:

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),
                  '<columns_to_delete>', '\'FIELD_REMOVED\'')
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE TABLE_NAME = '<table>'
             AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

Замена <table>, <database> и `

Удаленный столбец заменяется строкой "FIELD_REMOVED", в моем случае это работает, потому что я пытался сохранить память. (Поле, которое я удаляю, является BLOB размером около 1 МБ)

1 голос
/ 04 сентября 2009

Вы можете использовать SQL для генерации SQL, если вам нравится и оценивать SQL, который он производит. Это общее решение, поскольку оно извлекает имена столбцов из информационной схемы. Вот пример из командной строки Unix.

Подставив

  • MYSQL с вашей командой mysql
  • ТАБЛИЦА с именем таблицы
  • ИСКЛЮЧЕННОЕ ПОЛЕ с исключенным именем поля
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1) | MYSQL

Вам действительно нужно будет только таким образом извлечь имена столбцов только один раз, чтобы составить список столбцов, исключая этот столбец, а затем просто использовать построенный вами запрос.

Так что-то вроде:

column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)

Теперь вы можете повторно использовать строку $column_list в создаваемых вами запросах.

1 голос
/ 05 декабря 2013

Я хотел бы добавить другую точку зрения для решения этой проблемы, особенно если у вас есть небольшое количество столбцов для удаления.

Вы можете использовать инструмент БД, такой как MySQL Workbench , чтобы сгенерировать оператор выбора для вас, так что вам просто нужно вручную удалить эти столбцы для сгенерированного оператора и скопировать его в ваш скрипт SQL. 1005 *

В MySQL Workbench способ его генерации:

Щелкните правой кнопкой мыши по таблице -> отправить в Sql Editor -> Выбрать все выписки.

1 голос
/ 12 августа 2008

Если это всегда один и тот же столбец, вы можете создать представление, в котором его нет.

В противном случае, нет, я так не думаю.

0 голосов
/ 22 февраля 2013

Я довольно опаздываю с ответом на этот вопрос, скажу так, я всегда делал это, и, честно говоря, он в 100 раз лучше и аккуратнее, чем лучший ответ, я только надеюсь, что кто-то его увидит. И найти это полезным

    //create an array, we will call it here. 
    $here = array();
    //create an SQL query in order to get all of the column names
    $SQL = "SHOW COLUMNS FROM Table";
        //put all of the column names in the array
        foreach($conn->query($SQL) as $row) {
            $here[] = $row[0];
        }
    //now search through the array containing the column names for the name of the column, in this case i used the common ID field as an example
    $key = array_search('ID', $here);
    //now delete the entry
    unset($here[$key]);
0 голосов
/ 03 июня 2019

Принятый ответ имеет несколько недостатков.

  • Сбой, когда имена таблиц или столбцов требуют обратных символов
  • Сбой, если столбец, который вы хотите опустить, является последним в списке
  • Требуется дважды перечислить имя таблицы (один раз для выбора и другой для текста запроса), что является избыточным и ненужным
  • Он может потенциально возвращать имена столбцов в неправильном порядке

Все эти проблемы можно преодолеть, просто включив обратные пометки в SEPARATOR для вашего GROUP_CONCAT и используя условие WHERE вместо REPLACE(). Для моих целей (и я полагаю, что многие другие) я хотел, чтобы имена столбцов возвращались в том же порядке, в котором они появляются в самой таблице. Чтобы достичь этого, здесь мы используем явное предложение ORDER BY внутри функции GROUP_CONCAT():

SELECT CONCAT(
    'SELECT `',
    GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
    '` FROM `',
    `TABLE_SCHEMA`,
    '`.`',
    TABLE_NAME,
    '`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
    AND `TABLE_NAME` = 'my_table'
    AND `COLUMN_NAME` != 'column_to_omit';
0 голосов
/ 16 января 2014

Select * является антипаттерном SQL. Он не должен использоваться в производственном коде по многим причинам, включая:

Это занимает чуть больше времени для обработки. Когда вещи запускаются миллионы раз, эти крошечные кусочки могут иметь значение. Медленная база данных, где медлительность вызвана этим типом небрежного кодирования повсюду, является самым трудным для настройки производительности.

Это означает, что вы, вероятно, отправляете больше данных, чем вам нужно, что вызывает узкие места как на сервере, так и в сети. Если у вас есть внутреннее объединение, шансы отправить больше данных, чем вам нужно, составляют 100%.

Это вызывает проблемы с обслуживанием, особенно если вы добавили новые столбцы, которые вы не хотите видеть повсюду. Кроме того, если у вас есть новый столбец, вам может потребоваться сделать что-то с интерфейсом, чтобы определить, что делать с этим столбцом.

Это может нарушить представления (я знаю, что это верно для SQl-сервера, это может или не может быть верно для MySQL).

Если кто-то настолько глуп, чтобы перестраивать таблицы со столбцами в другом порядке (что не следует делать, но это происходит постоянно), любой код может сломаться. Особенно код для вставки, например, когда вы неожиданно вводите город в поле address_3, так как без указания, база данных может идти только по порядку столбцов. Это достаточно плохо, когда типы данных изменяются, но хуже, когда поменяемые столбцы имеют один и тот же тип данных, потому что вы можете пойти на какое-то время, вставляя неверные данные, которые бесполезны для очистки. Вы должны заботиться о целостности данных.

Если он используется во вставке, он прервет вставку, если в одну таблицу будет добавлен новый столбец, но не во другую.

Это может сломать триггеры. Проблемы запуска могут быть сложными для диагностики.

Добавьте все это к тому времени, которое требуется для добавления в имена столбцов (черт возьми, у вас может даже быть интерфейс, который позволяет перетаскивать имена столбцов (я знаю, что в SQL Server я уверен, что я уверен, что для этого можно использовать инструмент, который вы используете для написания запросов MySQL.) Давайте посмотрим: «Я могу вызвать проблемы с обслуживанием, я могу вызвать проблемы с производительностью и проблемы с целостностью данных, но я сэкономил пять минут времени на разработку». На самом деле просто укажите нужные столбцы.

Я также предлагаю вам прочитать эту книгу: http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1389896688&sr=1-1&keywords=sql+antipatterns

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...