2013-08-08 6 views
0

Я пытаюсь создать хранимая процедура, которая будет обновлять определенное расположение столбцов и столбцов на основе ввода пользователем. Моя таблица имеет приблизительно 100 столбцов, использующих имена в прогрессивных приращениях. Ex Page1, Page2, Page3, стр. 4 .... и т. Д. Данные также должны обновляться с постепенным шагом, так как пользователи заканчивают разные версии каждой страницы.SQL-обновление строк без знания имени столбца

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

---------------------------------------------------- 
| Page1 | Page2 | Page3 | Page4 | 
---------------------------------------------------- 
| /pg1.htm | /pg2.htm | /pg3.htm | NULL  | 
---------------------------------------------------- 
| /pg1.doc | /pg2.doc | NULL  | NULL  | 
---------------------------------------------------- 
| /pg1.pdf | NULL  | NULL  | NULL  | 
---------------------------------------------------- 

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

псевдо код, который я состряпал выглядит так, но это очень неэффективно:

FIND ROW that matches unique key 
LOOP Find_NULL 
    IF Column2 == NULL 
     UPDATE DATA HERE 
    ELSE IF Column3 == NULL 
     UPDATE DATA HERE 
    ELSE IF Column4 == NULL 
     UPDATE DATA HERE 
    ELSE IF.... and on and on 
END LOOP Find_NULL 

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

Если у кого есть какие-либо решения или рекомендации, я был бы признателен.

Заранее спасибо.

ответ

3

На первый взгляд вы, кажется, страдаете от довольно плохого дизайна базы данных.

Вы не хотите называть столбцы «Страница1», «Страница 2» ... «Страница 100», а затем эти столбцы должны быть NULL большую часть времени. Это нарушает дизайн звуковой базы данных. Возможно, вам захочется ознакомиться с такими понятиями, как нормализация базы данных (например, первая нормальная форма, вторая и т. Д.).

Я думаю, вам будет намного лучше иметь столбец с именем «Страница», а затем каждая строка будет иметь значение от 1 до 100 вместе с информацией, относящейся к этой странице. Таким образом, вам не нужно будет динамически комбинировать имена столбцов при формировании запроса на вставку/обновление.

+0

Большое спасибо за информацию Рэнди. Я согласен с тем, что мой дизайн, вероятно, неверен. Все, чему я научился, самообучалось из книги, Интернета и экспериментов. Пора вернуться на чертежные доски на этом. – user2615851

2

Я бы рекомендовал вам преобразовать столбцы в строки. Таким образом вам просто нужно вставить новую строку, которая намного эффективнее.

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

User,Seq,Val 
1,1,/pg1.htm 
1,2,/pg2.htm 
1,3,/pg3.htm 
2,1,/pg1.doc 
2,2,/pg2.doc 
3,1,/pg1.pdf 
+0

Благодарим вас за информацию Declan. Ваш вклад вдохновил другой подход, который я попытаюсь сделать. – user2615851

0

Ваш стол не в first normal form, и поэтому вы страдаете от всех проблем германа к этой конструкции проблемы.

Если вы посмотрите на эту ссылку, вы увидите, что предлагаемое решение заключается в создании отдельной таблицы, связывающей повторяющиеся группы с родительским объектом (вашей текущей строкой). В вашем конкретном случае это означает, что у вас будет отдельная таблица страниц, связывающая номера страниц (1, 2, 3, ..., n) с уникальным ключом в этой (родительской) таблице и сохраняя данные, относящиеся к этой странице в таблице «Страницы».

+0

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

Смежные вопросы