|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.04.2009, 23:43 | #1 |
Подтвердите свой е-майл
Регистрация: 13.04.2009
Сообщений: 8
|
SQL: как присвоить записи её порядковый номер?
Вопрос в следующем есть таблица.. в ней некоторое число записей..
необходимо при создании новой записи автоматически присвоить ей следующий порядковый номер.. Как я понимаю для этого просто надо посчитать количество записей полученный ответ увеличить на еденицу и записать в поле новой записи.. в SQL количество считает COUNT() но кауда он записывает результат? и как направить этот результат в переменную.. подскажите.. с таблицей работаю через Query... |
18.04.2009, 07:54 | #2 |
Форумчанин
Регистрация: 04.04.2009
Сообщений: 438
|
Можно себе представить беднягу пользователя, работающего с такой базой.
При каждом добавлении записи сидит и ждет, когда же сервер посчитает сколько там этих записей, если таблица имеет миллионы строк. А если серьезно, то такой алгоритм не годится, если нужны уникальные номера записей. На примере. Есть две записи под номерами 1 и 2. Удаляем первую запись потом добавляем еще одну. В результате обе записи будут иметь один и тот же номер - 2. Так годится? Чтобы ответить на этот вопрос необходимо знать как используются (или предполагается использовать) присвоенные номера записей. В SQL базах, где действительно требуются уникальные номера (идентификаторы) записей получение такого ИД уже давным-давно автоматизировано. Результат запроса select count(*) from <имя таблицы> возвращается в том же DataSet (Query, например), который отправил запрос. А "...направить этот результат в переменную" можно так: Код:
Последний раз редактировалось Скандербег; 18.04.2009 в 08:12. |
18.04.2009, 09:44 | #3 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Скандербег, +1
полностью согласен. FReeMAN(Q), 1) есть такой тип поля, как autoincrement (счётчик) тогда сама СУБД будет наращивать счётчик при записи в базу 2) в нормальных СУБД ещё есть такое понятие как генератор последовательностей (SEQUENCE) (результаты поиска на гугл) 3) Если СУБД это не предусматривает — например, FoxPro for DOS - тогда оптимальный способ держать отдельно табличку, где хранить имя таблицы и текущий доступный код. Надо добавить запись - открывает эту вспогательную табличку, находим там запись для нашей таблицы, лочим(блокируем) запись (чтобы не было конфликтов при одновременной многопользовательской работе по добавлению данных), наращиваем счётчик, записываем новое значение в эту вспомогательную таблицу, разблокируем запись, и добавляем новую запись в таблицу со взятым значением счётчика. и последнее, если таблица маленькая (или учебная задача) и со всем вышеуказанным заморачиваться не хочется, тогда, всё же лучше вместо количества записей брать максимальное значение счётчика: Код:
|
18.04.2009, 10:10 | #4 |
Подтвердите свой е-майл
Регистрация: 13.04.2009
Сообщений: 8
|
нужно что бы полю Pnom присваивался порядковый номер записи и что бы при удалении например записи с порядковым номером (Pnom) 5 этот порядковый номер присваивался записи вставшей на её место... все просто.. но чего то не выходит..
Код:
видимо я не догоняю как правильно втыкнуть счетчик.. P.S.: и все же как при удаленнии одной записи присваивать остальным их порядковые номера в таблице.. автоматически.. Последний раз редактировалось FReeMAN(Q); 18.04.2009 в 10:12. |
18.04.2009, 10:28 | #5 | |
Подтвердите свой е-майл
Регистрация: 13.04.2009
Сообщений: 8
|
Цитата:
|
|
18.04.2009, 10:34 | #6 | |
Форумчанин
Регистрация: 04.04.2009
Сообщений: 438
|
Присвоение значения переменной есть (cntrec:=form1.Query2.fieldbyname(' pnom').AsInteger; ), а где тот самый запрос о количестве записей?
Вначале надо сделать запрос, а потом уже вытаскивать и присваивать кол-во записей. Код:
Цитата:
В некоторых применяется, как сказал Serge_Bliznykov, автоинкрементное поле (пункт 1. в его посте). Последний раз редактировалось Скандербег; 18.04.2009 в 10:45. |
|
18.04.2009, 11:14 | #7 |
Подтвердите свой е-майл
Регистрация: 13.04.2009
Сообщений: 8
|
спасибо вам за помощь.. последний вопрос..
при использовании данного кода Код:
|
18.04.2009, 11:18 | #8 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
Надеюсь, что Вы догадались изменить выборку на: Код:
Цитата:
сделать,конечно, можно что угодно - и зайца можно научить курить, вот только ЗАЧЕМ?!! Нумеруйте записи при выборке, или в отчёте. зачем их в таблице номеровать то?!?! p.s. Ага. Кажется понял. Ваша проблема в том, что Вы пытаетесь использовать естественный ключ в качестве искуственного. Подробнее можно об этом почитать здесь — Анатолий Тенцер, Естественные ключи против искуственных ключей на подобные грабли мы неоднократно наступали.. ;( у Вас поле pnom чтото означает для характеристики покупки?!? номер счёта или какой-то ещё номер, который нужен пользователю?! Тогда, мой Вам совет: (если структура таблицы (и программа) доступны Вам для модицикации, конечно!) добавляйте новое поле — настоящий уникальный идентификатор. И делайте с полем pnom что душеньке угодно! |
||
18.04.2009, 11:23 | #9 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
Код:
|
|
18.04.2009, 11:32 | #10 |
Форумчанин
Регистрация: 04.04.2009
Сообщений: 438
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как присвоить ячейке имя? | Maxx | Microsoft Office Excel | 2 | 01.11.2008 11:30 |
НОМЕР ЗАПИСИ))) | chekanoff | БД в Delphi | 2 | 02.04.2008 09:18 |
присвоить переменной целого типа значение поля key полученное в результате выполнения SQL запроса | Worms | БД в Delphi | 5 | 10.01.2008 21:07 |
Как присвоить апостраф? | Apollo_13 | Общие вопросы Delphi | 3 | 08.08.2007 14:37 |
Как выбрать при помощи SQL записи из набора данных | pris | БД в Delphi | 4 | 22.05.2007 11:24 |