53 колонны? Я бы придерживался SELECT *, как предлагает Томас в этом случае ... разве что в этом дополнительном столбце содержится огромное количество данных, которые было бы нежелательно извлекать ...?
Майк Стоун
За исключением одного столбца ... Я полагаю, вы знаете, какой из них следует игнорировать, следовательно, INFORMATION_SCHEMA.columns это путь.
Альфабраво
Проверьте этот ответ, он делает то, что вы хотите сделать!
ДонЛ
Столбец больших данных является реальной проблемой, когда хранятся географические данные. Столбцы могут быть размером в несколько мегабайт. Они хорошо работают там, где предложения находят строки, но вам часто не нужны эти данные в результатах.
Джейсон
Обычно для этого используется исключение столбца идентификатора с автоматическим приращением. Например, чтобы выбрать данные для вставки в другую таблицу, которая имеет свой собственный идентификатор.
ToolmakerSteve
Ответы:
222
На самом деле есть способ, вам нужно иметь разрешения, конечно, для этого ...
SET@sql = CONCAT('SELECT ',(SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),'<columns_to_omit>,','')FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='<table>'AND TABLE_SCHEMA ='<database>'),' FROM <table>');
PREPARE stmt1 FROM@sql;EXECUTE stmt1;
предостережение: запросы INFORMATION_SCHEMA имеют довольно низкую производительность, поэтому будьте осторожны, этот тип запроса ни в коем случае не является критическим путем.
Билл Карвин
9
Как сказал @Jan Koritak ниже, этот ответ на самом деле не работает, если столбцы заголовка, которые вы хотите удалить, также являются подстрокой заголовка для любых столбцов, которые вы хотите сохранить. Есть лучший ответ, похожий на этот, который можно найти здесь .
ДонЛ
8
Это намного хуже, чем просто указание столбцов, что является известным передовым опытом.
HLGEM
3
Это не работает, если в именах столбцов есть пробелы. Это должно быть обновлено, чтобы всегда окружать имена в <column_name>
кавычках
3
Это также не сработает, если игнорируемый столбец является последним из перечисленных в структуре таблицы (поскольку замена не будет соответствовать завершающей коме).
Винсент Пазеллер
61
В определениях mysql (руководство) такой вещи нет. Но если у вас действительно большое количество столбцов col1, ... col100, может быть полезно следующее:
Дало мне сообщение об ошибке на 3-м шаге: «Количество столбцов не соответствует значению в строке 1». Поэтому я изменил шаг 2 на «UPDATE temp_tb SET id = NULL», и тогда это сработало.
Ойвей
1
Хорошо, это работает. Но когда я снова запускаю этот запрос, он выдает ошибку, что temp_tb уже существует. Сколько времени temp_tb находится в памяти? Извиняюсь, если это глупый вопрос. PS проголосовал за твой ответ.
Каран
2
@Karan Чтобы выполнить этот запрос несколько раз, добавьте в начало еще одну команду:DROP TABLE IF EXISTS temp_tb;
gregn3
1
@Karan Чтобы указать механизм памяти, используйте команду:, в CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); противном случае она по умолчанию сохраняется на диск и сохраняется после перезапуска сервера. ( спасибо )
gregn3
Отличный ответ. Для удаления нескольких столбцов , обратитесь к этому ответу .
HAHA! Да, конечно. Теперь, как вы строите представление, чтобы включить все НО в один из столбцов. Я думаю, вы видите, как это напрашивается на оригинальный вопрос. На самом деле я нашел этот поток именно потому, что хотел создать представление, исключающее определенные столбцы, без необходимости явного перечисления всех оставшихся столбцов в определении представления.
Большинство ответов с более высоким рейтингом в основном просто находят способы сгенерировать этот точный запрос без ввода вручную
mehtunguh
5
На самом деле, из соображений обслуживания полезно иметь запрос типа «все, кроме». В противном случае явные списки полей должны быть обновлены, если новые поля будут добавлены позже.
Leiavoia
1
@lev, это правильно, и ОНИ ДОЛЖНЫ БЫТЬ !!! Поскольку вы не знаете, хотите ли вы иметь какие-либо будущие столбцы (это могут быть столбцы метаданных или те, которые не относятся к конкретному экрану). Вы не; Я хочу, чтобы вы повредили производительности, возвращая больше, чем вам нужно (что верно в 100% случаев, когда у вас есть внутреннее соединение). Я предлагаю вам немного прочитать о том, почему select * является антипаттерном SQL.
HLGEM
26
ОП сообщает, что есть> 50 столбцов, так что это довольно непрактично.
Авгурар
1
@ HLGEM Не совсем, я хотел выбрать все столбцы без обслуживания запроса каждый раз, когда добавляю новый столбец, кроме одного из них, и в моем случае это просто не сработало. Но в любом случае я применил решение Sean O для себя
OverCoder
26
Если вы хотите исключить значение поля, например, из соображений безопасности / конфиденциальной информации, вы можете получить этот столбец как нулевой.
Почему? Не работает Если у вас есть столбец зарплата, этот запрос будет просто с результатами, имеющими два столбца с именем зарплата, один полный нулей и один с фактической зарплатой.
Myforwik
4
@Myforwik Этот запрос действительно добавляет второй salaryстолбец. Но так как он получен после *, он перезаписывает оригинал. Это не красиво, но это работает.
Шон О
68
SQL всегда допускал дублирование имен столбцов в наборе результатов. Если вы хотите, чтобы это работало, вам нужно запустить его с клиентским приложением, которое не поддерживает дублирование и отдает приоритет последнему дублированию. Официальный клиент командной строки поддерживает dupes. HeidiSQL также поддерживает их. SQL Fiddle этого не делает, но отображает первый обман, а не последний. Подводя итог: это не работает .
Альваро Гонсалес
9
Конечно, это не работает. Это отличный пример того, почему вы должны проверять свои ответы в самом mysql, а не через библиотеки, которые общаются с mysql.
Myforwik
8
@SeanO, @ Аластер, @ Все, не отменяют. Сервер по-прежнему возвращает конфиденциальные данные.
Pacerier
22
Насколько я знаю, нет. Вы можете сделать что-то вроде:
SELECT col1, col2, col3, col4 FROM tbl
и вручную выберите нужные столбцы. Однако, если вам нужно много столбцов, вы можете просто сделать:
SELECT*FROM tbl
и просто игнорируйте то, что вы не хотите.
В вашем конкретном случае я бы предложил:
SELECT*FROM tbl
если вы хотите только несколько столбцов. Если вы хотите только четыре столбца, то:
SELECT col3, col6, col45, col 52FROM tbl
было бы хорошо, но если вы хотите 50 столбцов, то любой код, который делает запрос, станет (слишком?) трудным для чтения.
Выбор * - плохой выбор всегда. Не рекомендую это. Узнайте, почему это SQl Antipattern.
HLGEM
18
Пробуя решения @Mahomedalid и @Junaid, я обнаружил проблему. Так что думал поделиться этим. Если в имени столбца есть пробелы или дефисы, такие как регистрация, запрос не будет выполнен. Простой обходной путь - использовать обратную галочку вокруг имен столбцов. Модифицированный запрос ниже
SET@SQL = CONCAT('SELECT ',(SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME,"`"))FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'AND COLUMN_NAME NOTIN('id')),' FROM users');
PREPARE stmt1 FROM@SQL;EXECUTE stmt1;
Если в столбце, который вы не хотели выбирать, содержалось огромное количество данных, и вы не хотели включать его из-за проблем со скоростью, и вы часто выбираете другие столбцы, я бы предложил создать новую таблицу с одним полем, которое вы обычно не выбираете, с ключом к исходной таблице и удалите поле из исходной таблицы. Присоединяйтесь к таблицам, когда это дополнительное поле действительно требуется.
Моя главная проблема - много столбцов, которые я получаю при соединении таблиц. Хотя это не ответ на ваш вопрос (как выбрать все столбцы, кроме определенных, из одной таблицы), я думаю, стоит упомянуть, что вы можете указать, чтобы получить все столбцы из определенной таблицы, а не просто указыватьtable. .
Вот пример того, как это может быть очень полезно:
выберите пользователей. *, phone.meta_value в качестве телефона, zipcode.meta_value в качестве почтового индекса
от пользователей
оставь присоединиться к user_meta как телефон
включено ((users.user_id = phone.user_id) И (phone.meta_key = 'phone'))
оставьте присоединиться user_meta как почтовый индекс
на ((users.user_id = zipcode.user_id) И (zipcode.meta_key = 'zipcode'))
Результатом являются все столбцы из таблицы пользователей и два дополнительных столбца, которые были объединены из мета таблицы.
спасибо, мне нужно выбрать все столбцы первой таблицы и только одно поле из второй таблицы, и ваш ответ мне помог.
Мухаммед Фалахат
5
Мне понравился ответ @Mahomedalidпомимо этого факта, сообщенного в комментарии от @Bill Karwin. Возможная проблема, возникшая у @Jan Koritakменя, - это правда, я сталкивался с этим, но я нашел для этого хитрость и просто хочу поделиться ею здесь для всех, кто столкнулся с проблемой.
мы можем заменить функцию REPLACE предложением where в подзапросе оператора Prepared следующим образом:
Используя мою таблицу и имя столбца
SET@SQL = CONCAT('SELECT ',(SELECT GROUP_CONCAT(COLUMN_NAME)FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'AND COLUMN_NAME NOTIN('id')),' FROM users');
PREPARE stmt1 FROM@SQL;EXECUTE stmt1;
Таким образом, это будет исключать только поле, idно неcompany_id
Он действует как контракт с кодом, и, глядя на запрос, вы точно знаете, какие данные вы можете извлечь из него, не глядя на схему таблицы.
mbillard
6
@kodecraft: Это хорошая практика по той же причине, что и всегда рекомендуется возвращать один и тот же тип из функции (даже если вы работаете на языке, который не применяется). В основном только принцип наименьшего сюрприза.
Даниэль Приден
4
Просто делать
SELECT*FROMtableWHERE whatever
Затем поместите столбец на ваш любимый язык программирования: php
Если столбец, который вы хотите исключить, это большой BLOB или что-то в этом роде.
Билл Карвин
1
Это плохо, если вы пытаетесь избежать потери данных.
Кристофер Айвс
1 столбец из 53 не должен иметь никакого значения. Если это так, вероятно, плохой дизайн.
Петр Пеллер
1
SElect * является антипаттерном SQL и никогда не должен использоваться в производственном коде.
HLGEM
1
Я не согласен с тем, что SELECT * - это своего рода анти-шаблон, который никогда не должен использоваться в производственном коде. Гораздо понятнее, что вы извлекли все свои столбцы - по сравнению с перекрестными ссылками на длинный список столбцов, которые на самом деле могут быть или не быть всеми полями. Это, конечно же, намного быстрее, чтобы кодировать, безусловно. И есть много, много случаев, когда поля таблицы будут точно соответствовать полям в представлении или форме.
Джефф Кендалл
4
Я согласен с «простым» решением перечисления всех столбцов, но это может быть обременительным, а опечатки могут привести к потере большого количества времени. Я использую функцию «getTableColumns» для извлечения имен моих столбцов, подходящих для вставки в запрос. Тогда все, что мне нужно сделать, это удалить те, которые я не хочу.
CREATEFUNCTION`getTableColumns`(tablename varchar(100))
RETURNS varchar(5000) CHARSET latin1
BEGINDECLARE done INT DEFAULT0;DECLARE res VARCHAR(5000)DEFAULT"";DECLARE col VARCHAR(200);DECLARE cur1 CURSORFORselect COLUMN_NAME from information_schema.columns
where TABLE_NAME=@tableAND TABLE_SCHEMA="yourdatabase"ORDERBY ORDINAL_POSITION;DECLARECONTINUE HANDLER FORNOT FOUND SET done =1;OPEN cur1;
REPEAT
FETCH cur1 INTO col;IFNOT done THENset res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);ENDIF;
UNTIL done END REPEAT;CLOSE cur1;RETURN res;
Ваш результат возвращает строку с запятой, например ...
Это будет очень медленно для любого стола среднего размера.
Джоэл
3
Я согласен с тем, что недостаточно Select *, если тот, который вам не нужен, как упоминалось в другом месте, является BLOB, вы не хотите, чтобы эти накладные расходы закрались.
Я хотел бы создать представление с необходимыми данными, тогда вы можете Select *с комфортом - если программное обеспечение базы данных поддерживает их. Иначе, поместите огромные данные в другую таблицу.
Сначала я подумал, что вы можете использовать регулярные выражения, но, поскольку я читал документы MYSQL, кажется, вы не можете. На вашем месте я бы использовал другой язык (например, PHP) для генерации списка столбцов, которые вы хотите получить, сохранить его как строку и затем использовать его для генерации SQL.
Я согласен с ответом @ Mahomedalid, но я не хотел делать что-то вроде готового утверждения и не хотел вводить все поля, так что у меня было глупое решение.
Перейдите к таблице в phpmyadmin-> sql-> select, она выдаст запрос: скопируйте, замените и все готово! :)
Хотя я согласен с ответом Томаса (+1;)), я хотел бы добавить предостережение о том, что столбец, который вам не нужен, содержит едва ли какие-либо данные. Если он содержит огромное количество текста, xml или двоичных двоичных объектов, найдите время для выбора каждого столбца в отдельности. Ваше выступление пострадает в противном случае. Ура!
Ответ, опубликованный Махомедалидом, имеет небольшую проблему:
Внутри кода функции замены была замена " <columns_to_delete>," на "", эта замена имеет проблему, если заменяемое поле является последним в строке concat, поскольку последнее не имеет запятой "," и не удаляется из строка.
Мое предложение:
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 МБ)
Может быть, у меня есть решение указанного несоответствия Яна Коритака
SELECT CONCAT('SELECT ',(SELECT GROUP_CONCAT(t.col)FROM(SELECTCASEWHEN COLUMN_NAME ='eid'THENNULLELSE COLUMN_NAME
ENDAS col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='employee'AND TABLE_SCHEMA ='test') t
WHERE t.col ISNOTNULL),' 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
Вы можете использовать SQL для генерации SQL, если вам нравится и оценивать SQL, который он производит. Это общее решение, поскольку оно извлекает имена столбцов из информационной схемы. Вот пример из командной строки Unix.
Подставляя
MYSQL с вашей командой mysql
СТОЛ с именем таблицы
EXCLUDEDFIELD с исключенным именем поля
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строку в строящихся запросах.
Я хотел бы добавить другую точку зрения для решения этой проблемы, особенно если у вас есть небольшое количество столбцов для удаления.
Вы можете использовать инструмент БД, такой как MySQL Workbench , чтобы сгенерировать оператор выбора для вас, так что вам просто нужно вручную удалить эти столбцы для сгенерированного оператора и скопировать его в ваш скрипт SQL.
В MySQL Workbench способ его создания:
Щелкните правой кнопкой мыши по таблице -> отправить в Sql Editor -> Выбрать все выписки.
Сбой, когда имена таблиц или столбцов требуют обратных кавычек
Сбой, если столбец, который вы хотите опустить, является последним в списке
Это требует перечисления имени таблицы дважды (один раз для выбора и другого для текста запроса), что является избыточным и ненужным
Потенциально может возвращать имена столбцов в неправильном порядке
Все эти проблемы могут быть преодолены путем простого включения обратных галочек в SEPARATORfor for GROUP_CONCATи использования WHEREусловия вместо REPLACE(). Для моих целей (и я полагаю, что многие другие) я хотел, чтобы имена столбцов возвращались в том же порядке, в котором они появляются в самой таблице. Чтобы достичь этого, здесь мы используем явноеORDER BY предложение внутри GROUP_CONCAT()функции:
Я довольно опаздываю с ответом на этот вопрос, говоря, что я всегда так делал, и, честно говоря, это в 100 раз лучше и аккуратнее, чем лучший ответ, я только надеюсь, что кто-то его увидит. И найти это полезным
//create an array, we will call it here.$here = array();//create an SQL query inorderto get allof the column names
$SQL ="SHOW COLUMNS FROM Table";//put allof 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]);
Это может быть красиво, но это не отвечает на вопрос: он не спрашивал о php, и вы не даете оператор выбора или результат того, что он хочет, а только массив php, содержащий нужные ему столбцы.
gou1
2
-1. Это не код SQL, и здесь нет никакого SELECTзаявления - слово даже не встречается ни разу.
Фрунги
Это только в той степени, в которой (а) вам удобнее работать с PHP, чем SQL, или (б) вам нравится распределять код по нескольким строкам для удобства чтения. Я бы признал точку (б). Ваш подход также будет менее производительным, хотя во многих случаях использование будет незначительным. Также смотрите другие комментарии на ваш вопрос. Не стоит орать, поэтому советуем удалить неуместный комментарий из исходного вопроса.
mc0e
-5
Select * является антипаттерном SQL. Он не должен использоваться в производственном коде по многим причинам, включая:
Это занимает чуть больше времени для обработки. Когда вещи запускаются миллионы раз, эти крошечные кусочки могут иметь значение. Медленная база данных, где медлительность вызвана этим типом небрежного кодирования повсюду, является самым трудным для настройки производительности.
Это означает, что вы, вероятно, отправляете больше данных, чем вам нужно, что вызывает узкие места как на сервере, так и в сети. Если у вас есть внутреннее соединение, шансы отправить больше данных, чем вам нужно, составляют 100%.
Это вызывает проблемы обслуживания, особенно если вы добавили новые столбцы, которые вы не хотите видеть повсюду. Кроме того, если у вас есть новый столбец, вам может потребоваться сделать что-то с интерфейсом, чтобы определить, что делать с этим столбцом.
Это может нарушить представления (я знаю, что это верно для сервера SQl, это может или не может быть правдой в MySQL).
Если кто-то достаточно глуп, чтобы перестроить таблицы со столбцами в другом порядке (что не следует делать, но это происходит постоянно), любой код может сломаться. Особенно код для вставки, например, когда вы неожиданно вводите город в поле address_3, так как без указания, база данных может идти только по порядку столбцов. Это достаточно плохо, когда типы данных изменяются, но хуже, когда поменяемые столбцы имеют один и тот же тип данных, потому что вы можете пойти на какое-то время, вставляя неверные данные, которые бесполезны для очистки. Вы должны заботиться о целостности данных.
Если он используется во вставке, он прервет вставку, если в одну таблицу будет добавлен новый столбец, но не во другую.
Это может сломать триггеры. Проблемы запуска могут быть сложными для диагностики.
Прибавьте все это к тому времени, которое требуется для добавления в имена столбцов (черт возьми, у вас может даже быть интерфейс, который позволяет перетаскивать имена столбцов (я знаю, что в SQL Server я уверен, что могу поспорить, что есть какой-то способ Это инструмент, который вы используете для написания запросов mysql. Давайте посмотрим: «Я могу вызвать проблемы с обслуживанием, я могу вызвать проблемы с производительностью и проблемы с целостностью данных, но эй, я сэкономил пять минут времени на разработку». в определенных столбцах, которые вы хотите.
Ответы:
На самом деле есть способ, вам нужно иметь разрешения, конечно, для этого ...
Замена
<table>, <database> and <columns_to_omit>
источник
<column_name>
В определениях mysql (руководство) такой вещи нет. Но если у вас действительно большое количество столбцов
col1
, ...col100
, может быть полезно следующее:источник
DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb);
противном случае она по умолчанию сохраняется на диск и сохраняется после перезапуска сервера. ( спасибо )Будет ли лучше работать View в этом случае?
источник
Ты можешь сделать:
без получения column3, хотя, возможно, вы искали более общее решение?
источник
Если вы хотите исключить значение поля, например, из соображений безопасности / конфиденциальной информации, вы можете получить этот столбец как нулевой.
например
источник
salary
столбец. Но так как он получен после *, он перезаписывает оригинал. Это не красиво, но это работает.Насколько я знаю, нет. Вы можете сделать что-то вроде:
и вручную выберите нужные столбцы. Однако, если вам нужно много столбцов, вы можете просто сделать:
и просто игнорируйте то, что вы не хотите.
В вашем конкретном случае я бы предложил:
если вы хотите только несколько столбцов. Если вы хотите только четыре столбца, то:
было бы хорошо, но если вы хотите 50 столбцов, то любой код, который делает запрос, станет (слишком?) трудным для чтения.
источник
Пробуя решения @Mahomedalid и @Junaid, я обнаружил проблему. Так что думал поделиться этим. Если в имени столбца есть пробелы или дефисы, такие как регистрация, запрос не будет выполнен. Простой обходной путь - использовать обратную галочку вокруг имен столбцов. Модифицированный запрос ниже
источник
Если в столбце, который вы не хотели выбирать, содержалось огромное количество данных, и вы не хотели включать его из-за проблем со скоростью, и вы часто выбираете другие столбцы, я бы предложил создать новую таблицу с одним полем, которое вы обычно не выбираете, с ключом к исходной таблице и удалите поле из исходной таблицы. Присоединяйтесь к таблицам, когда это дополнительное поле действительно требуется.
источник
Вы можете использовать DESCRIBE my_table и использовать результаты этого для динамического генерирования оператора SELECT.
источник
Моя главная проблема - много столбцов, которые я получаю при соединении таблиц. Хотя это не ответ на ваш вопрос (как выбрать все столбцы, кроме определенных, из одной таблицы), я думаю, стоит упомянуть, что вы можете указать, чтобы получить все столбцы из определенной таблицы, а не просто указывать
table.
.
Вот пример того, как это может быть очень полезно:
Результатом являются все столбцы из таблицы пользователей и два дополнительных столбца, которые были объединены из мета таблицы.
источник
Мне понравился ответ
@Mahomedalid
помимо этого факта, сообщенного в комментарии от@Bill Karwin
. Возможная проблема, возникшая у@Jan Koritak
меня, - это правда, я сталкивался с этим, но я нашел для этого хитрость и просто хочу поделиться ею здесь для всех, кто столкнулся с проблемой.мы можем заменить функцию REPLACE предложением where в подзапросе оператора Prepared следующим образом:
Используя мою таблицу и имя столбца
Таким образом, это будет исключать только поле,
id
но неcompany_id
источник
Рекомендуется указывать столбцы, которые вы запрашиваете, даже если вы запрашиваете все столбцы.
Поэтому я бы предложил вам написать название каждого столбца в заявлении (исключая тот, который вам не нужен).
источник
Просто делать
Затем поместите столбец на ваш любимый язык программирования: php
источник
Я согласен с «простым» решением перечисления всех столбцов, но это может быть обременительным, а опечатки могут привести к потере большого количества времени. Я использую функцию «getTableColumns» для извлечения имен моих столбцов, подходящих для вставки в запрос. Тогда все, что мне нужно сделать, это удалить те, которые я не хочу.
Ваш результат возвращает строку с запятой, например ...
источник
Да, хотя это может быть высокий уровень ввода-вывода в зависимости от таблицы, здесь я нашел обходной путь.
источник
Я согласен с тем, что недостаточно
Select *
, если тот, который вам не нужен, как упоминалось в другом месте, является BLOB, вы не хотите, чтобы эти накладные расходы закрались.Я хотел бы создать представление с необходимыми данными, тогда вы можете
Select *
с комфортом - если программное обеспечение базы данных поддерживает их. Иначе, поместите огромные данные в другую таблицу.источник
Сначала я подумал, что вы можете использовать регулярные выражения, но, поскольку я читал документы MYSQL, кажется, вы не можете. На вашем месте я бы использовал другой язык (например, PHP) для генерации списка столбцов, которые вы хотите получить, сохранить его как строку и затем использовать его для генерации SQL.
источник
Я тоже этого хотел, поэтому вместо этого создал функцию.
Итак, как это работает, вы входите в таблицу, а затем в столбец, который вам не нужен, или как в массиве: array ("id", "name", "whatcolumn")
Так что в select вы можете использовать это так:
или
источник
Я согласен с ответом @ Mahomedalid, но я не хотел делать что-то вроде готового утверждения и не хотел вводить все поля, так что у меня было глупое решение.
Перейдите к таблице в phpmyadmin-> sql-> select, она выдаст запрос: скопируйте, замените и все готово! :)
источник
Хотя я согласен с ответом Томаса (+1;)), я хотел бы добавить предостережение о том, что столбец, который вам не нужен, содержит едва ли какие-либо данные. Если он содержит огромное количество текста, xml или двоичных двоичных объектов, найдите время для выбора каждого столбца в отдельности. Ваше выступление пострадает в противном случае. Ура!
источник
Ответ, опубликованный Махомедалидом, имеет небольшую проблему:
Внутри кода функции замены была замена "
<columns_to_delete>,
" на "", эта замена имеет проблему, если заменяемое поле является последним в строке concat, поскольку последнее не имеет запятой "," и не удаляется из строка.Мое предложение:
Замена
<table>
,<database>
и `Удаленный столбец заменяется строкой «FIELD_REMOVED», в моем случае это работает, потому что я пытался сохранить память. (Поле, которое я удаляю, является BLOB-файлом размером около 1 МБ)
источник
Основываясь на ответе @Mahomedalid, я сделал несколько улучшений для поддержки «выберите все столбцы, кроме некоторых в mysql»
Если у вас много столбцов, используйте этот sql для изменения group_concat_max_len
источник
Может быть, у меня есть решение указанного несоответствия Яна Коритака
Таблица :
================================
================================
Результат запроса:
источник
Если это всегда один и тот же столбец, вы можете создать представление, в котором его нет.
Иначе нет, я так не думаю.
источник
Вы можете использовать SQL для генерации SQL, если вам нравится и оценивать SQL, который он производит. Это общее решение, поскольку оно извлекает имена столбцов из информационной схемы. Вот пример из командной строки Unix.
Подставляя
Вам действительно нужно будет извлечь имена столбцов таким способом только один раз, чтобы создать список столбцов, исключая этот столбец, а затем просто использовать построенный запрос.
Так что-то вроде:
Теперь вы можете повторно использовать
$column_list
строку в строящихся запросах.источник
Я хотел бы добавить другую точку зрения для решения этой проблемы, особенно если у вас есть небольшое количество столбцов для удаления.
Вы можете использовать инструмент БД, такой как MySQL Workbench , чтобы сгенерировать оператор выбора для вас, так что вам просто нужно вручную удалить эти столбцы для сгенерированного оператора и скопировать его в ваш скрипт SQL.
В MySQL Workbench способ его создания:
Щелкните правой кнопкой мыши по таблице -> отправить в Sql Editor -> Выбрать все выписки.
источник
Принятый ответ имеет несколько недостатков.
Все эти проблемы могут быть преодолены путем простого включения обратных галочек в
SEPARATOR
for forGROUP_CONCAT
и использованияWHERE
условия вместоREPLACE()
. Для моих целей (и я полагаю, что многие другие) я хотел, чтобы имена столбцов возвращались в том же порядке, в котором они появляются в самой таблице. Чтобы достичь этого, здесь мы используем явноеORDER BY
предложение внутриGROUP_CONCAT()
функции:источник
У меня есть предложение, но нет решения. Если некоторые из ваших столбцов имеют большие наборы данных, попробуйте выполнить следующие
источник
Я довольно опаздываю с ответом на этот вопрос, говоря, что я всегда так делал, и, честно говоря, это в 100 раз лучше и аккуратнее, чем лучший ответ, я только надеюсь, что кто-то его увидит. И найти это полезным
источник
SELECT
заявления - слово даже не встречается ни разу.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 & ключевые слова = SQL + antipatterns
источник