Вибрати всі стовпці, крім одного, в MySQL?


365

Я намагаюся використовувати оператор select, щоб отримати всі стовпці з певної таблиці MySQL, крім однієї. Чи є простий спосіб це зробити?

Редагувати: У цій таблиці є 53 стовпчики (НЕ МОЙ ДИЗАЙН)


6
53 стовпчики? Я б дотримувався SELECT *, як пропонує Томас у такому випадку ... хіба що в цьому додатковому стовпці є величезна кількість даних, яку було б небажано отримати ...?
Майк Стоун

За винятком однієї колони ... Я думаю, ви знаєте, яку слід ігнорувати, отже, INFORMATION_SCHEMA.колонки - це спосіб.
Альфабраво

Перевірте цю відповідь, вона робить те, що ви хочете зробити!
donL

Стовпчик великих даних - це справжня проблема, коли зберігаються географічні дані. Стовпці можуть мати розмір мегабайт. Вони добре працюють там, де пропонується знайти рядки, але ви часто не бажаєте цих даних в результатах.
Джейсон

Загальне використання для цього - виключити стовпчик ідентифікатора автоматичного збільшення. Наприклад, для вибору даних, які потрібно вставити в іншу таблицю, яка має свій ідентифікатор.
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;

Заміна <table>, <database> and <columns_to_omit>


20
Застереження: INFORMATION_SCHEMA запити мають досить низьку ефективність, тому будьте обережні, що цей тип запитів не перебуває у критичному шляху для нічого.
Білл Карвін

9
Як сказано нижче @Jan Koritak, ця відповідь насправді не працює, якщо стовпці заголовка, які ви хочете видалити, також є підрядком заголовка для будь-яких стовпців, які ви хочете зберегти. Є краща відповідь, схожа на цю, яку можна знайти тут .
donL

8
Це набагато гірше, ніж просто вказати стовпці, що є найкращою практикою.
HLGEM

3
Це не працює, якщо в назвах стовпців є пробіли. Його слід оновлювати, щоб завжди оточувати імена на <column_name>
задніх полях

3
Це також не буде працювати, якщо стовпець, який слід ігнорувати, є останнім, вказаним у структурі таблиці (оскільки заміна не буде відповідати заднім комам).
Вінсент Пазеллер

61

У визначеннях 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;
SELECT * FROM temp_tb;

4
Подав мені повідомлення про помилку на 3-му кроці: "Кількість стовпців не відповідає кількості значень у рядку 1". Тому я змінив крок 2 на "UPDATE temp_tb SET id = NULL", а потім він працював.
oyvey

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

Відмінна відповідь. Щоб видалити кілька стовпців , зверніться до цієї відповіді .
S3DEV

45

Чи краще в такому випадку працювати Перегляд?

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table

15
ХАХА! Так, звісно. Тепер, як ви побудуєте подання, щоб включити всі, але НЕ один із стовпців. Я думаю, ви бачите, як це ставить початкове запитання. Насправді я знайшов цю тему саме тому, що хотів створити подання, яке виключало б певні стовпці, не змушуючи явно перераховувати всі решта стовпців у визначенні перегляду.
Кріс Надович

31

Ви можете зробити:

SELECT column1, column2, column4 FROM table WHERE whatever

не отримуючи колонку3, хоча, можливо, ви шукали більш загальне рішення?


3
Більшість відповідей із більш високим рейтингом - це здебільшого лише пошук способів генерування цього точного запиту без набору тексту вручну
mehtunguh

5
Власне, з міркувань технічного обслуговування корисно мати запит "все, крім". Інакше явні списки полів повинні бути оновлені, якщо нові поля будуть додані пізніше.
leiavoia

1
@lev, це правильно, і вони повинні бути !!! Оскільки ви не знаєте, чи хочете ви мати будь-які майбутні стовпці (це можуть бути стовпці з метаданими або ті, які не застосовуються до певного екрану). Ви не робите; хочете завдати шкоди продуктивності, повертаючи більше, ніж потрібно (що справді 100% часу, коли ви маєте внутрішнє з'єднання), я пропоную вам прочитати, чому вибір * є антипаттерном SQL.
HLGEM

26
У штаті ОП є> 50 стовпців, тому це досить недоцільно.
серпня

1
@HLGEM Насправді, я хотів вибрати всі стовпці, не підтримуючи запит кожного разу, коли я додаю новий стовпець, окрім одного з них, і це не буде просто працювати в моєму випадку. Але все одно я застосував для себе рішення Шона О
OverCoder

26

Якщо ви хочете виключити значення поля, наприклад, для питань безпеки / конфіденційної інформації, ви можете отримати цей стовпець як нульовий.

напр

SELECT *, NULL AS salary FROM users

13
Чому? Це не працює. Якщо у вас є заробітна плата у стовпці, цей запит закінчиться лише результатами, що мають два стовпці з іменем зарплати, один з повними нулями та один із фактичною зарплатою.
Myforwik

4
@Myforwik Цей запит дійсно додає другий salaryстовпець. Але оскільки він отриманий після *, він перезаписує оригінал. Це не дуже, але це працює.
Шон О

67
SQL завжди дозволяв дублювати імена стовпців у наборі результатів. Якщо ви хочете, щоб це спрацювало, вам потрібно запустити його з клієнтською програмою, яка не підтримує дупи та надає пріоритет останньому дупу. Офіційний клієнт командного рядка підтримує dupes. HeidiSQL також підтримує їх. SQL Fiddle ні, але відображає першу дуп, а не останню. Підводячи підсумок: це не працює .
Альваро Гонсалес

9
Звичайно, це не працює. Це чудовий приклад того, чому ви повинні перевірити свої відповіді в самому mysql, а не через бібліотеки, які спілкуються з mysql.
Myforwik

8
@SeanO, @ Alastair, @ Усі, не перекриває. Сервер все ще повертає конфіденційні дані.
Печер'є

22

Наскільки мені відомо, цього немає. Ви можете зробити щось на кшталт:

SELECT col1, col2, col3, col4 FROM tbl

і вручну вибирайте потрібні стовпці. Однак, якщо вам потрібно багато стовпців, ви можете просто зробити:

SELECT * FROM tbl 

і просто ігноруйте те, чого ви не хочете.

У вашому конкретному випадку я б запропонував:

SELECT * FROM tbl

якщо ви хочете лише кілька стовпців. Якщо ви хочете лише чотири стовпці, тоді:

SELECT col3, col6, col45, col 52 FROM tbl

було б добре, але якщо ви хочете 50 стовпців, то будь-який код, який робить запит, стане (важко?) важким для читання.


3
Вибір * - це поганий вибір завжди. Не рекомендую. Прочитайте про те, чому це 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 NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;

11

Якщо стовпець, який ви не хотіли вибрати, мав у ньому величезну кількість даних, і ви не хотіли його включати через проблеми зі швидкістю, а інші стовпці вибираєте часто, я б запропонував вам створити нову таблицю з одним полем, яке ви зазвичай не вибираєте ключем до оригінальної таблиці, і видаліть поле з початкової таблиці. Приєднуйтесь до таблиць, коли це додаткове поле фактично потрібно.


9

Ви можете використовувати DESCRIBE my_table і використовувати результати цього для динамічного генерування оператора SELECT.


8

Моя основна проблема - це багато колонок, які я отримую під час приєднання до таблиць. Хоча це не відповідь на ваше запитання (як вибрати всі таблиці, крім певних, з однієї таблиці), я думаю, варто згадати, що ви можете вказати, щоб отримати всі стовпці з певної таблиці, а не просто вказуватиtable. .

Ось приклад того, як це може бути дуже корисним:

виберіть користувачів. *, phone.meta_value як телефон, zipcode.meta_value як поштовий індекс

від користувачів

зліва приєднатись до user_meta як телефон
увімкнено ((users.user_id = phone.user_id) AND (phone.meta_key = 'телефон'))

зліва приєднатися до user_meta як поштовий індекс
увімкнено ((users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode'))

Результатом є всі стовпці з таблиці користувачів та два додаткові стовпчики, які були об'єднані з мета-таблиці.


2
дякую, мені потрібно вибрати всі стовпці першої таблиці і лише одне поле з другої таблиці приєднання, і ваша відповідь допомогла мені.
mohammad falahat

5

Мені сподобалась відповідь, @Mahomedalidокрім цього факту, повідомленого у коментарі @Bill Karwin. Можлива проблема, яка виникає, @Jan Koritakправда, я зіткнувся з цим, але я знайшов хитрість у цьому і просто хочу поділитися цим для всіх, хто стикається з проблемою.

ми можемо замінити функцію REPLACE на пункт, де в підзапросі «Підготовлений оператор» такий:

Використовуючи мою назву таблиці та стовпців

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


4

Добре вказувати стовпці, які ви запитуєте, навіть якщо ви запитуєте всі стовпці.

Тому я б запропонував вам написати ім'я кожного стовпця у виписці (виключаючи той, який ви не хочете).

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

Він діє як договір з кодом, і, дивлячись на запит, ви точно знаєте, які дані ви можете отримати з нього, не дивлячись на схему таблиці.
mbillard

6
@kodecraft: Це добра практика з тієї ж причини, що це завжди добре повернути один і той же тип з функції (навіть якщо ви працюєте мовою, де це не застосовується). В основному лише принцип найменшого сюрпризу.
Даніель Приден

4

Просто роби

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,";
   }      
}

6
Якщо стовпець, який ви хочете виключити, це величезний BLOB або щось подібне.
Білл Карвін

1
Це погано, якщо ви намагаєтеся уникати даремих даних.
Крістофер Івз

1 стовпець із 53 не повинен мати жодних змін. Якщо це зробити, це, мабуть, поганий дизайн.
Петро Пеллер

1
SElect * є антипаттерном SQL і його не слід використовувати у виробничому коді.
HLGEM

1
Я не погоджуюся, що SELECT * - це якийсь антидіапазон, який "ніколи" не повинен використовуватися у виробничому коді. Набагато зрозуміліше ви отримали всі свої стовпці - порівняно з перехресним посиланням на довгий список стовпців, які можуть бути чи ні, насправді всі поля. Це також, очевидно, набагато швидше кодувати. І є багато, багато випадків, коли поля таблиці точно відповідатимуть полям у поданні чи формі.
Джефф Кендалл

4

Я погоджуюся з "простим" рішенням перерахування всіх стовпців, але це може бути обтяжливим, а помилки друку можуть спричинити багато витраченого часу. Я використовую функцію "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



4

Так, хоча це може бути високим введенням / виведенням залежно від таблиці, тут я знайшов вирішення.

SELECT *
INTO #temp
FROM table

ALTER TABLE #temp DROP COlUMN column_name

SELECT *
FROM #temp

Це буде дуже повільно для будь-якого столу середнього розміру.
Джоель

3

Я погоджуюсь, що недостатньо Select *, якщо той, який вам не потрібен, як це було зазначено в іншому місці, є БЛОБ, ви не хочете, щоб у вас був цей повз.

Я б створив перегляд з необхідними даними, тоді ви можете Select *комфортно - якщо програмне забезпечення бази даних їх підтримує. Інше, покладіть величезні дані в іншу таблицю.


3

Спочатку я думав, що ви можете використовувати регулярні вирази, але, як я читав документи MYSQL, здається, ви не можете. Якби я був ти, я би використовував іншу мову (наприклад, PHP) для створення списку стовпців, який ти хочеш отримати, зберігати його як рядок, а потім використовувати його для генерації SQL.


3

Я цього хотів і тому створив функцію замість цього.

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", "незалежно стовпець")

Тож у виборі ви можете використовувати його так:

mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");

або

mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");

3

Я погоджуюся з відповіддю @ Махомедаліда, але я не хотів робити щось на кшталт підготовленої заяви і не хотів вводити всі поля, тому те, що у мене було, було дурним рішенням.

Перейдіть до таблиці в phpmyadmin-> sql-> select, він скидає запит: скопіюйте, замініть і зробіть! :)


2

Хоча я згоден з відповіддю Томаса (+1;)), я хотів би додати застереження, що я вважаю, що стовпець, який ви не хочете, містить майже ніякі дані. Якщо вона містить величезну кількість тексту, xml або двійкових крапок, то знайдіть час, щоб вибрати кожен стовпчик окремо. Ваша робота постраждає інакше. Ура!


2

У відповіді, опублікованій Махомедалідом, є невелика проблема:

Внутрішній код функції заміни замінював " <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 МБ)


2

На основі @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;

Якщо у вас багато cols, використовуйте цей sql, щоб змінити group_concat_max_len

SET @@group_concat_max_len = 2048;

2

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

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'

1

Якщо це завжди один і той же стовпець, ви можете створити подання, у якому його немає.

Інакше ні, я не думаю.


1

Ви можете використовувати 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рядок у запитах, які ви створюєте.


1

Я хотів би додати ще одну точку зору, щоб вирішити цю проблему, особливо якщо у вас є невелика кількість стовпців, які потрібно видалити.

Ви можете використовувати такий інструмент БД, як MySQL Workbench , щоб генерувати оператор select для вас, тому вам просто потрібно видалити ці стовпці для згенерованого оператора та скопіювати його у свій сценарій SQL.

У MySQL Workbench спосіб її генерування:

Клацніть правою кнопкою миші на таблиці -> надіслати в редактор Sql -> Вибрати всю заяву.


1

Прийнята відповідь має кілька недоліків.

  • Він не вдається, де назви таблиці чи стовпців потребують зворотних посилань
  • Він не вдається, якщо стовпець, який ви хочете опустити, останній у списку
  • Для цього потрібно перераховувати назву таблиці двічі (один раз для вибору та іншу для тексту запиту), що є зайвим та непотрібним
  • Він може потенційно повертати назви стовпців у неправильному порядку

Усі ці проблеми можна подолати, просто включивши зворотні посилання у 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

У мене є пропозиція, але не рішення. Якщо деякі ваші стовпці мають більший набір даних, тоді слід спробувати наступне

SELECT *, LEFT(col1, 0) AS col1, LEFT(col2, 0) as col2 FROM table

-1

Я досить пізно закидаю відповідь на це, кажу, що це я завжди робив це і, чесно кажучи, його в 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, що містить потрібні стовпці.
gou1

2
–1. Це не код SQL, і тут немає SELECTзаяви - слово навіть не виникає один раз.
Фрунгі

Це лише акуратніше настільки, що (а) вам зручніше PHP, ніж SQL, або (б) вам подобається поширювати свій код на кілька рядків для читабельності. Я б погодився на пункт (b). Ваш підхід також буде менш ефективним, хоча різниця буде незначною у багатьох випадках використання. Також дивіться інші коментарі до вашого питання. Не варто кричати, тому пропонуйте видалити невідповідний коментар із початкового запитання.
mc0e

-5

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 + антишаблони

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.