Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Как безболезненно проверить наличие в столбца?


Автор: =Женек= 24.4.2009, 12:48
Есть таблица, каждый месяц к ней будет добавляться столбец, с именем, содержащим текущий месяц и год.
Каким запросом проверить, есть ли столбец с таким именем, чтобы не генерировалась ошибка, а чтобы например, в случае отсутствия такового mysql возвращал ноль или что-то в этом роде?

Автор: azesmcar 24.4.2009, 12:54
Цитата

Есть таблица, каждый месяц к ней будет добавляться столбец, с именем, содержащим текущий месяц и год.

 smile 

Код

show columns from table_name where ...

Автор: DimW 24.4.2009, 12:54
чем вызвана необходимость добавления поля каждый месяц?

Автор: =Женек= 24.4.2009, 13:02
Потому как  каждый месяц записываются данные из двумерного массива и создавать таблицу на каждый месяц неохота.
Я выстроил двумерную таблицу по рядам.

Автор: DimW 24.4.2009, 13:05
Цитата(=Женек= @  24.4.2009,  13:02 Найти цитируемый пост)
Я выстроил двумерную таблицу по рядам.

вам не кажется, что это как то не сочитается с реляционной моделью?

Автор: =Женек= 24.4.2009, 13:05
show columns from oet_balls where name='d200904' -  выдало ошибку #1054 - Unknown column 'name' in 'where clause'

Автор: azesmcar 24.4.2009, 13:09
Цитата

show columns from oet_balls where name='d200904' -  выдало ошибку #1054 - Unknown column 'name' in 'where clause' 

не name а Field

Автор: =Женек= 24.4.2009, 13:10
DimW, объясняю задачу.
В учреждении работают эксперты и лаборанты. Их труд оценивается в баллах.  Причем закрепленности сотрудников друг за другом нет - все работают со всеми.
Итог работы - таблица - по горизонтали эксперты, по вертикали лаборанты, в ячейках баллы каждого эксперта с каждым лаборантом. А еще хочется каждый месяц добавлять в таблицу новые данные, сохраняя старые.

По совету людей на этом же форуме я сделал таблицу с полями:
laborant expert d200904

в соответствии со всеми возможными сочетаниями экспертов и лаборантов добавляю строки:

Э1---Л1  10
Э1--Л2   20
Э2--Л1   25
Э2--Л2  30


Критикуйте, как хотите, но программа уже написана и отлично работает. Осталось добавить внесение данных с добавлением нового столбца.


Автор: azesmcar 24.4.2009, 13:10
а вообще горизонтальное расширение таблиц - это извращенство smile 
лучше добавить колонку DATE

Автор: DimW 24.4.2009, 13:25
Цитата(=Женек= @  24.4.2009,  13:10 Найти цитируемый пост)
DimW, объясняю задачу.

=Женек=, связь многие ко многим организуется другим образом.
если критика в ваш адрес неуместна, то не буду вас переубеждать.

Автор: =Женек= 24.4.2009, 14:00
Да почему же, буду рад критике.
Объясните, каким образом правильно, на будущее.

Автор: DimW 24.4.2009, 14:27
Цитата(=Женек= @  24.4.2009,  14:00 Найти цитируемый пост)
Объясните, каким образом правильно, на будущее. 

ок:

Цитата(=Женек= @  24.4.2009,  13:10 Найти цитируемый пост)
В учреждении работают эксперты и лаборанты. Их труд оценивается в баллах.

отсюда получаем сущность "ЛАБОРАНТ" и "ЭКСПЕРТ".

Код

ЛАБОРАНТ:
--------------------
id          name
--          ----
1           Иванов
2           Петров
3           Сидоров


Код

ЭКСПЕРТ:
--------------------
id          name
--          ----
10          Иванова
20          Петрова
30          Сидорова


обычно связь многие ко многим организуется третьей таблицей, в ней и будет информация о баллах:
Код

ЭКСПЕРТ_ЛАБОРАНТ:
--------------------
id          id_expert          id_laborant          ball
--          ----               ----                 ----
1           10                 1                    50
2           10                 2                    55
3           10                 3                    20
4           20                 1                    100


получаем что эксперт Иванова работала со всеми лаборантами и все лаборанты работали с ней.
эксперт Петрова работала только с лаборантом Ивановым, а Иванов и с Ивановой и с Петровой.
А эксперт Сидорова вообще ни скем не работала.

думаю обьяснил доходчиво, дерзайте. smile

Автор: =Женек= 24.4.2009, 15:41
DimW, а в чем отличие того что предложили вы от того, как сделал я? (см. описание выше)
И где трехмерность, то бишь баллы для разных дат?

Таблица, которую вы создали будет относительно нехилая (в нашем учреждении в одном только отделе получится 221 ряд в таблице), а если добавить столбец date, то каждый месяц придется прибавлять по 221 записи с практически дублирующим содержимым (лаборант и эксперт). Если же расширять таблицу добавлением колонок, то добавляется всего одна колонка с цифрами.

Автор: azesmcar 24.4.2009, 15:59
Цитата

Таблица, которую вы создали будет относительно нехилая

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

Автор: DimW 24.4.2009, 16:20
Цитата(=Женек= @  24.4.2009,  15:41 Найти цитируемый пост)
то бишь баллы для разных дат?

периоды я бы организовал отдельной сущностью:
Код

ПЕРИОД:
--------------------
id          start_date          end_date
--          ----                ----
1           01.01.2009          31.01.2009
2           01.02.2009          28.02.2009
3           01.03.2009          31.03.2009


и в таблицу ЭКСПЕРТ_ЛАБОРАНТ добавил id_period:
Код

ЭКСПЕРТ_ЛАБОРАНТ:
--------------------
id          id_expert          id_laborant          ball          id_period
--          ----               ----                 ----          ----
1           10                 1                    50            1
2           10                 2                    55            1
3           10                 3                    20            2
4           20                 1                    100           3


=Женек=, вы бы лучше подумали как потом отчетность строить будите по своей структуре чем беспокоеться о такой ерунде:
Цитата(=Женек= @  24.4.2009,  15:41 Найти цитируемый пост)
то каждый месяц придется прибавлять по 221 записи с практически дублирующим содержимым 


Автор: DimW 24.4.2009, 16:35
Цитата(=Женек= @  24.4.2009,  15:41 Найти цитируемый пост)
а в чем отличие того что предложили вы от того, как сделал я? 

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

select ЭКСПЕРТ_ЛАБОРАНТ.*
  from ПЕРИОД
      ,ЭКСПЕРТ_ЛАБОРАНТ
 where ПЕРИОД between :p_start_date and :p_end_date -- передаем в параметры любой период
   and ЭКСПЕРТ_ЛАБОРАНТ.id_period = ПЕРИОД.id


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

Автор: =Женек= 24.4.2009, 17:18
Зачем периоды отдельной сущностью?
Вроде бы как-то мождно записывать тип date чтобы он содержал только год и месяц...

Автор: Bikutoru 24.4.2009, 17:23
Если еще актуально:
Код

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='Database' AND TABLE_NAME='table' and COLUMN_NAME='column'

Хотя, имхо, добавлять колонку каждый месяц - плохая идея.

Добавлено через 3 минуты и 55 секунд
http://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html
Еще одна причина НЕ добавлять колонки каждый месяц:
Цитата

Every table has a maximum row size of 65,535 bytes.

При большом количестве колонок (а их может быть не больше 4096 или 1000 в InnoDB) этого может не хватить

Автор: DimW 24.4.2009, 17:31
Цитата(=Женек= @  24.4.2009,  17:18 Найти цитируемый пост)
Зачем периоды отдельной сущностью?

это дело вкуса, в данном конкретном случае можно обойтись и добавлением поля, но представте что в будущем у вас появится еще сущность которая должна ограничиваться рамками того же приода что и лаборанты, эксперты, в этом случае сущность ПЕРИОД будет кстати.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)