Я пытаюсь использовать оператор select, чтобы получить все столбцы из определенной таблицы MySQL, кроме одного. Есть простой способ сделать это?
Обновлено: В этой таблице 53 столбца (НЕ МОЙ ДИЗАЙН)
Проверьте этот ответ, он делает то, что вы хотите!
53 столбца? Я бы придерживался SELECT *, как предлагает Томас в этом случае ... если в этом дополнительном столбце нет огромного количества данных, которые было бы нежелательно извлекать ...?
Столбец больших данных представляет собой реальную проблему, когда хранятся географические данные. Столбцы могут иметь размер в несколько мегабайт. Они хорошо работают в предложениях where для поиска строк, но вам часто не нужны эти данные в результатах.
Обычно это используется для исключения столбца идентификатора автоинкремента. Например, чтобы выбрать данные для вставки в другую таблицу, у которой есть собственный идентификатор.






Насколько мне известно, нет. Вы можете сделать что-то вроде:
SELECT col1, col2, col3, col4 FROM tbl
и вручную выберите нужные столбцы. Однако, если вам нужно много столбцов, вы можете просто сделать:
SELECT * FROM tbl
и просто игнорируйте то, что вам не нужно.
В вашем конкретном случае я бы предложил:
SELECT * FROM tbl
если вам не нужно всего несколько столбцов. Если вам нужно всего четыре столбца, тогда:
SELECT col3, col6, col45, col 52 FROM tbl
было бы хорошо, но если вам нужно 50 столбцов, то любой код, который делает запрос, станет (слишком?) трудным для чтения.
Select * всегда плохой выбор. Не рекомендую. Прочтите, почему это антипаттерн SQl.
Ты можешь сделать:
SELECT column1, column2, column4 FROM table WHERE whatever
без получения column3, хотя, возможно, вы искали более общее решение?
Большинство ответов с более высоким рейтингом в основном просто поиск способов сгенерировать этот точный запрос без ввода вручную.
На самом деле, из соображений обслуживания полезно иметь запрос типа «все, кроме». В противном случае явные списки полей должны быть обновлены, если новые поля будут добавлены позже.
@lev, это правильно и ОНИ ДОЛЖНЫ БЫТЬ !!! BE потому что вы не знаете, хотите ли вы иметь какие-либо будущие столбцы (они могут быть столбцами метаданных или столбцами, которые не относятся к конкретному экрану). Вы не делаете; хотите снизить производительность, возвращая больше, чем вам нужно (что верно в 100% случаев, когда у вас есть внутреннее соединение). Я предлагаю вам прочитать о том, почему select * является антипаттерном SQL.
OP заявляет, что существует> 50 столбцов, поэтому это довольно непрактично.
@HLGEM Не совсем, я хотел выбирать все столбцы без поддержки запроса каждый раз, когда я добавляю новый столбец, кроме одного из них, и в моем случае это не сработало бы. Но в любом случае я применил решение Шона О для себя
Если в столбце, который вы не хотели выбирать, было огромное количество данных, и вы не хотели включать его из-за проблем со скоростью, и вы часто выбираете другие столбцы, я бы посоветовал вам создать новую таблицу. с одним полем, которое вы обычно не выбираете ключом к исходной таблице, и удалите это поле из исходной таблицы. Присоединяйтесь к таблицам, когда это дополнительное поле действительно необходимо.
Вы можете использовать ОПИСАТЬ my_table и использовать результаты этого для динамического создания оператора SELECT.
Будет ли в этом случае работать лучше?
CREATE VIEW vwTable
as
SELECT
col1
, col2
, col3
, col..
, col53
FROM table
ХАХА! Да, конечно. Теперь, как создать представление, которое будет включать все, НО один из столбцов. Я думаю, вы понимаете, как возникает исходный вопрос. Фактически, я нашел этот поток специально, потому что я хотел создать представление, которое исключало определенные столбцы, без необходимости явно перечислять все оставшиеся столбцы в определении представления.
Вы получили ответ на «Снарка» десятилетней давности. вы бы не сделали этого для одноразовых запросов. это архитектурное решение.
Я согласен с тем, что Select * недостаточно, если тот, который вам не нужен, как упоминалось в другом месте, является BLOB, вы не хотите, чтобы эти накладные расходы вкрались.
Я бы создал Посмотреть с необходимыми данными, тогда вы сможете с комфортом Select * - если программное обеспечение базы данных поддерживает их. В противном случае поместите огромные данные в другую таблицу.
Если это всегда один и тот же столбец, вы можете создать представление, в котором его нет.
В противном случае нет, я так не думаю.
Рекомендуется указывать запрашиваемые столбцы, даже если вы запрашиваете все столбцы.
Поэтому я предлагаю вам написать имя каждого столбца в заявлении (за исключением того, который вам не нужен).
SELECT
col1
, col2
, col3
, col..
, col53
FROM table
Он действует как контракт с кодом, и, глядя на запрос, вы точно знаете, какие данные можно извлечь из него, не глядя на схему таблицы.
@kodecraft: Это хорошая практика по той же причине, что и всегда возвращать один и тот же тип из функции (даже если вы работаете на языке, где это не применяется). По сути, это принцип наименьшего удивления.
Сначала я подумал, что вы можете использовать регулярные выражения, но, поскольку я читал Документы MYSQL, кажется, что вы не можете. На вашем месте я бы использовал другой язык (например, PHP) для создания списка столбцов, который вы хотите получить, сохранил его как строку, а затем использовал бы его для генерации SQL.
Хотя я согласен с ответом Томаса (+1;)), я хотел бы добавить предостережение, что я предполагаю, что столбец, который вы хотите не, почти не содержит данных. Если он содержит огромное количество текста, XML или двоичных двоичных объектов, найдите время, чтобы выбрать каждый столбец по отдельности. В противном случае ваша производительность пострадает. Ваше здоровье!
Вы можете использовать SQL для генерации SQL, если хотите, и оценить SQL, который он производит. Это общее решение, поскольку оно извлекает имена столбцов из информационной схемы. Вот пример из командной строки Unix.
Подставляя
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 в создаваемых вами запросах.
На самом деле есть способ, вам, конечно же, нужны разрешения для этого ...
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;
Замена <table>, <database> and <columns_to_omit>
предостережение: запросы INFORMATION_SCHEMA имеют довольно низкую производительность, поэтому будьте осторожны, этот тип запроса не является критическим для чего-либо.
Как @Jan Koritak сказал ниже, этот ответ на самом деле не работает, если столбцы заголовка, которые вы хотите удалить, также являются подстрокой заголовка для любых столбцов, которые вы хотите сохранить. Есть лучший ответ, похожий на этот, который можно найти здесь.
Это решение не работает, если у вас есть имена столбцов, такие как id, product_id и т. д. stackoverflow.com/a/17719025/1827513 - правильный ответ.
Это намного хуже, чем просто указать столбцы, что является известной передовой практикой.
Конечно, это хуже, чем просто указать столбцы, дело в том, что иногда вам нужно сгенерировать SQL из инструмента CASE или фреймворка всего за один шаг без использования внешних языков.
Это не работает, если в именах столбцов есть пробелы. Его следует обновить, чтобы имена всегда были заключены в обратные кавычки <column_name>.
Это также не сработает, если столбец, который следует игнорировать, является последним в списке в структуре таблицы (поскольку замена не будет соответствовать конечной запятой).
Действительно отличное решение для нашей БД, таблицы которой содержат досадно большой XML-столбец.
Просто делать
SELECT * FROM table WHERE whatever
Затем опустите столбец на своем любимом языке программирования: php
while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
unset($data["id"]);
foreach ($data as $k => $v) {
echo"$v,";
}
}
Если столбец, который вы хотите исключить, не является огромным BLOB или чем-то в этом роде.
Это плохо, если вы пытаетесь избежать потери данных.
1 столбец из 53 не должен иметь никакого значения. Если это так, вероятно, это плохой дизайн.
SElect * - это антипаттерн SQL, и его никогда не следует использовать в производственном коде.
Я не согласен с тем, что SELECT * - это своего рода антишаблон, который «никогда» не следует использовать в производственном коде. Гораздо яснее, что вы извлекли все свои столбцы - по сравнению с перекрестными ссылками на длинный список столбцов, который на самом деле может быть или не быть всеми полями. Кроме того, очень очевидно, что код намного быстрее. И есть очень много случаев, когда поля таблицы будут точно соответствовать полям в представлении или форме.
Идеальное решение. Из всех странных длинных и неясных решений, которые я видел до сих пор, это простое, ясное и отлично работает. Хотя это может быть неэффективно для некоторых людей с огромными базами данных, но для большинства из нас это просто идеально. В моем случае отдельные столбцы SELECT * или SELECT не имеют никакого значения, все, что мне нужно, это исключить два столбца с метками времени из списка, который вряд ли будет иметь 20-30 записей на пользователя. Так что эффективность для меня не снизилась.
это жизнеспособное решение, только если вы тот человек, которому нравится php (и не работает для чистых манипуляций с sql)
Да, хотя это может быть много операций ввода-вывода в зависимости от таблицы, вот обходной путь, который я нашел для этого.
SELECT *
INTO #temp
FROM table
ALTER TABLE #temp DROP COlUMN column_name
SELECT *
FROM #temp
Это будет ужасно медленно для любого стола среднего размера.
В определениях mysql (руководство) такого нет. Но если у вас действительно большое количество столбцов col1, ..., col100, вам может пригодиться следующее:
DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_x;
#// ALTER TABLE temp_tb DROP col_a, ... , DROP col_z; #// for a few columns to drop
SELECT * FROM temp_tb;
Выдал мне сообщение об ошибке на 3-м шаге: «Количество столбцов не соответствует количеству значений в строке 1». Поэтому я изменил шаг 2 на «UPDATE temp_tb SET id = NULL», и тогда он сработал.
Хорошо, это работает. Но когда я снова запускаю этот запрос, он выдает ошибку, что temp_tb уже существует. Сколько времени temp_tb находится в памяти? Прошу прощения, если это глупый вопрос. P.S. поддержал ваш ответ.
@Karan Чтобы повторно запускать этот запрос, добавьте еще одну команду в начало: DROP TABLE IF EXISTS temp_tb;
@Karan Чтобы указать механизм памяти, используйте команду: CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); , в противном случае он сохраняется на диск по умолчанию и переживает перезапуск сервера. (Благодарность)
Отличный ответ. Для удаление нескольких столбцов см. этот ответ.
HEY DATABASE COPY EVERYTHING TO MEMORY SO I CAN READ ONE THING; :)
Я согласен с «простым» решением перечислить все столбцы, но это может быть обременительным, а опечатки могут привести к потере времени. Я использую функцию getTableColumns для получения имен моих столбцов, подходящих для вставки в запрос. Тогда все, что мне нужно сделать, это удалить те, которые мне не нужны.
CREATE FUNCTION `getTableColumns`(tablename varchar(100))
RETURNS varchar(5000) CHARSET latin1
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE res VARCHAR(5000) DEFAULT "";
DECLARE col VARCHAR(200);
DECLARE cur1 CURSOR FOR
select COLUMN_NAME from information_schema.columns
where TABLE_NAME=@table AND TABLE_SCHEMA = "yourdatabase" ORDER BY ORDINAL_POSITION;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO col;
IF NOT done THEN
set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
RETURN res;
Ваш результат возвращает строку с разделителями-запятыми, например ...
col1,col2,col3,col4,...col53
Моя основная проблема - это множество столбцов, которые я получаю при объединении таблиц. Хотя это не ответ на ваш вопрос (как выбрать все столбцы, кроме определенных из таблицы один), я думаю, стоит упомянуть, что вы можете указать table. для получения всех столбцов из определенной таблицы, вместо того, чтобы просто указывать .
Вот пример того, как это может быть очень полезно:
select users.*, phone.meta_value as phone, zipcode.meta_value as zipcode from users left join user_meta as phone on ( (users.user_id = phone.user_id) AND (phone.meta_key = 'phone') ) left join user_meta as zipcode on ( (users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode') )
Результатом являются все столбцы из таблицы пользователей и два дополнительных столбца, которые были объединены из метатаблицы.
спасибо, мне нужно выбрать все столбцы первой таблицы и только одно поле из второй таблицы при объединении, и ваш ответ мне помог.
Ответ, отправленный Магомедалидом, содержит небольшую проблему:
Код функции замены внутри заменял "<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», в моем случае это работает, потому что я пытался сохранить память. (Поле, которое я удалял, представляет собой большой двоичный объект размером около 1 МБ)
Ответ от @Mahomedalid мне понравился, к тому же об этом сообщается в комментарии @Bill Karwin. Возможная проблема, поднятая @Jan Koritak, верна. Я столкнулся с этим, но я нашел уловку для этого и просто хочу поделиться им здесь для всех, кто сталкивается с проблемой.
мы можем заменить функцию REPLACE предложением where в подзапросе подготовленного оператора следующим образом:
Используя имя моей таблицы и столбца
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
Итак, это будет исключать только поле id, но не company_id.
Основываясь на ответе @Mahomedalid, я сделал некоторые улучшения для поддержки «выбрать все столбцы, кроме некоторых в mysql».
SET @database = 'database_name';
SET @tablename = 'table_name';
SET @cols2delete = 'col1,col2,col3';
SET @sql = CONCAT(
'SELECT ',
(
SELECT GROUP_CONCAT( IF(FIND_IN_SET(COLUMN_NAME, @cols2delete), NULL, COLUMN_NAME ) )
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND TABLE_SCHEMA = @database
),
' FROM ',
@tablename);
SELECT @sql;
Если у вас много столбцов, используйте этот sql для изменения group_concat_max_len
SET @@group_concat_max_len = 2048;
Я довольно поздно придумал ответ на этот вопрос, скажем так, я всегда это делал, и, честно говоря, он в 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]);
Это может быть аккуратно, но это не отвечает на вопрос: он не спрашивал о php, и вы не указываете оператор выбора или результат того, что он хочет, а только массив php, содержащий нужные ему столбцы.
–1. Это не код SQL, и здесь нет оператора SELECT - это слово даже не встречается ни разу.
Это аккуратнее лишь в той степени, в которой (а) вам удобнее работать с PHP, чем с SQL, или (б) вам нравится размещать свой код на нескольких строках для удобства чтения. Я бы уступил пункт (б). Ваш подход также будет менее производительным, хотя во многих случаях разница будет незначительной. Также смотрите другие комментарии к вашему вопросу. Не стоит кричать, поэтому предложите вам удалить неприемлемый комментарий из исходного вопроса.
Я тоже этого хотел, поэтому вместо этого создал функцию.
public function getColsExcept($table,$remove){
$res =mysql_query("SHOW COLUMNS FROM $table");
while($arr = mysql_fetch_assoc($res)){
$cols[] = $arr['Field'];
}
if (is_array($remove)){
$newCols = array_diff($cols,$remove);
return "`".implode("`,`",$newCols)."`";
}else{
$length = count($cols);
for($i=0;$i<$length;$i++){
if ($cols[$i] == $remove)
unset($cols[$i]);
}
return "`".implode("`,`",$cols)."`";
}
}
Итак, как это работает: вы вводите таблицу, а затем столбец, который вам не нужен, или как в массиве: array ("id", "name", "anycolumn")
Итак, в select вы можете использовать это так:
mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");
или же
mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");
Если вы хотите исключить значение поля, например для проблем безопасности / конфиденциальной информации вы можете получить этот столбец как нулевой.
например
SELECT *, NULL AS salary FROM users
Почему? Не работает. Если у вас есть столбец salary, этот запрос просто завершится с результатами, содержащими два столбца с именем salary, один с нулями и один с фактическими зарплатами.
@Myforwik Этот запрос действительно добавляет второй столбец salary. Но поскольку он извлекается после *, он перезаписывает оригинал. Это некрасиво, но работает.
Вы правы, @SeanO - я также не осознавал, что он заменяет исходный столбец. Очень аккуратный!
SQL всегда допускал повторяющиеся имена столбцов в наборе результатов. Если вы хотите, чтобы это сработало, вам нужно запустить его с клиентским приложением, которое не поддерживает дублирование. и отдает приоритет последнему дублированию. Официальный клиент командной строки поддерживает дублирование. HeidiSQL также поддерживает их. SQL Fiddle - нет, но отображает дублирование первый, не последнее. Подводя итог: это не работает.
Конечно не работает. Это отличный пример того, почему вы должны проверять свои ответы в самом mysql, а не через библиотеки, которые общаются с mysql.
@SeanO, @ Alastair, @ Everyone, Не отменяет. Сервер по-прежнему возвращает конфиденциальные данные.
Не работает. Возвращает два столбца, один с данными и один с нулями.
похоже, что он сделает свою работу, но вместо этого добавляет новый столбец.
Если вы выберете Object или Assoc, он перезапишет столбцы
Пробуя решения @Mahomedalid и @Junaid, я обнаружил проблему. Так что подумал о том, чтобы поделиться им. Если в имени столбца есть пробелы или дефисы, такие как отметка, запрос завершится ошибкой. Простое решение - использовать обратную кавычку вокруг имен столбцов. Измененный запрос ниже
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
Может у меня есть решение, чтобы Яна Коритака указал на несоответствие
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'
Я хотел бы добавить еще одну точку зрения, чтобы решить эту проблему, особенно если вам нужно удалить небольшое количество столбцов.
Вы можете использовать инструмент БД, такой как MySQL Workbench, чтобы сгенерировать для вас оператор выбора, поэтому вам просто нужно вручную удалить эти столбцы для сгенерированного оператора и скопировать его в свой сценарий SQL.
В MySQL Workbench способ его создания:
Щелкните правой кнопкой мыши по таблице -> отправить в редактор Sql -> Выбрать все инструкции.
Select * - это антипаттерн SQL. Его не следует использовать в производственном коде по многим причинам, в том числе:
Обработка занимает немного больше времени. Когда что-то запускается миллионы раз, эти крошечные биты могут иметь значение. Медленная база данных, в которой медлительность вызвана этим типом неаккуратного кодирования, является самым сложным для настройки производительности.
Это означает, что вы, вероятно, отправляете больше данных, чем вам нужно, что вызывает узкие места как на сервере, так и в сети. Если у вас есть внутреннее соединение, шансы отправить больше данных, чем вам нужно, составляют 100%.
Это вызывает проблемы с обслуживанием, особенно когда вы добавляете новые столбцы, которые не хотите видеть повсюду. Кроме того, если у вас есть новый столбец, вам может потребоваться что-то сделать с интерфейсом, чтобы определить, что делать с этим столбцом.
Это может нарушить представления (я знаю, что это правда на сервере SQl, это может быть или не быть правдой в mysql).
Если кому-то хватит глупости перестроить таблицы со столбцами в другом порядке (чего не следует делать, но это происходит постоянно), любой код может сломаться. Специально код для вставки, например, когда вы внезапно помещаете город в поле address_3, потому что без указания, база данных может идти только в порядке столбцов. Это достаточно плохо, когда типы данных меняются, но хуже, когда замененные столбцы имеют один и тот же тип данных, потому что вы можете иногда вставлять неверные данные, которые нужно очистить беспорядком. Вам нужно позаботиться о целостности данных.
Если он используется во вставке, он сломает вставку, если новый столбец добавлен в одну таблицу, но не в другую.
Это может сломать триггеры. Проблемы с триггером бывает сложно диагностировать.
Сложите все это против времени, необходимого для добавления имен столбцов (черт возьми, у вас даже может быть интерфейс, который позволяет вам перетаскивать имена столбцов (я знаю, что делаю это в SQL Server, держу пари, что есть какой-то способ do this - это какой-то инструмент, который вы используете для написания запросов 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
Я согласен с ответом @Mahomedalid, но я не хотел делать что-то вроде подготовленного оператора, и я не хотел вводить все поля, поэтому то, что у меня было, было глупым решением.
Перейдите в таблицу в phpmyadmin-> sql-> select, он выдает запрос: скопировать, заменить и готово! :)
У принятого ответа есть несколько недостатков.
Все эти проблемы можно решить, просто включив обратные кавычки в 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';
У меня есть предложение, но нет решения. Если некоторые из ваших столбцов имеют большие наборы данных, вам следует попробовать следующие
SELECT *, LEFT(col1, 0) AS col1, LEFT(col2, 0) as col2 FROM table
Если вы используете MySQL Workbench, вы можете щелкнуть правой кнопкой мыши свою таблицу и выбрать Send to sql editor, а затем Select All Statement. Это создаст оператор, в котором перечислены все поля, например:
SELECT `purchase_history`.`id`,
`purchase_history`.`user_id`,
`purchase_history`.`deleted_at`
FROM `fs_normal_run_2`.`purchase_history`;
SELECT * FROM fs_normal_run_2.purchase_history;
Теперь вы можете просто удалить те, которые вам не нужны.
Я использую эту работу, хотя она может быть «не по теме» - с использованием mysql workbench и построителя запросов -
За исключением одного столбца ... Я полагаю, вы знаете, какой из них следует игнорировать, поэтому INFORMATION_SCHEMA.columns - это способ.