34 / 41 / 5
Регистрация: 07.09.2011
Сообщений: 108
|
||||||
1 | ||||||
Последовательный генератор уникальных значений05.10.2012, 16:25. Показов 7822. Ответов 14
Метки нет (Все метки)
Есть таблицы с первичным ключом тип: int
Добавляя новые данные пользователь может: - либо сам ввести ключ - либо база сама должна его сгенерировать Моя реализация:
Есть ли какие либо способы ускорить этот процесс?
0
|
05.10.2012, 16:25 | |
Ответы с готовыми решениями:
14
MSSQL вставка уникальных значений Запрос с выводом уникальных значений Нахождение уникальных значений из таблицы по нескольким условиям Выборка из БД уникальных записей по нескольким столбцам и суммирование их значений |
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
|
|
05.10.2012, 16:41 | 2 |
А чем Identity не устраивает?
0
|
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
05.10.2012, 16:42 | 3 |
А зачем вам позволять пользователю самому вводить ключ? И что будет если он введет ключ который уже используется? Создали бы IDENTITY поле и все дела. Инкрементировался бы он у вас автоматически и все дела.
0
|
34 / 41 / 5
Регистрация: 07.09.2011
Сообщений: 108
|
|
05.10.2012, 21:03 [ТС] | 4 |
Долго объяснять, но суть в том, что в обычной ситуации ключ вводится автоматом (генерируется). Однако бывают случаи когда ключ должен быть указан явно. Так же в какой-то момент он может изменится. Может я конечно, что-то делаю не правильно, но с Identity такой вариант использования не проходит (ругается на явно указанные значения).
Если не трудно наставьте на путь истинный?)
0
|
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
05.10.2012, 21:33 | 5 |
То есть алгоритм будет такой:
Если ключ не указан, то выбираем максимальный ключ из существующих (это будет сделано по индексу мгновенно) и прибавляем к нему 1. Если максимального ключа нет (в таблице еще нет записей), то берем 0. Если ключ указан, то ищем есть ли уже такой в таблице (опять же быстро, по индексу, но уже не мгновенно). Если такой ключ уже существует, то предварительно в старой записи меняем его на новый (который определяем по первому варианту). В новой записи используем заданный ключ. И разумеется, никаких циклов.
1
|
1929 / 1164 / 423
Регистрация: 31.05.2012
Сообщений: 4,116
|
|
05.10.2012, 23:27 | 6 |
1
|
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
06.10.2012, 09:08 | 7 |
Для этого как раз и существуют транзакции, уровни изоляции, блокировка таблиц и т.д.
0
|
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
|
|
06.10.2012, 10:29 | 8 |
1
|
34 / 41 / 5
Регистрация: 07.09.2011
Сообщений: 108
|
|
06.10.2012, 14:02 [ТС] | 9 |
И ещё вопрос. Что будет когда значение поля с Identity примет максимально допустимое значение?
0
|
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
|
|
06.10.2012, 16:46 | 10 |
Тут требуется монопольная блокировка на чтение до конца транзакции.
Значит все выстроятся в очередь перед этим бутылочным горлышком. Плохо! Очень плохо! Вот тут гляньте: Организация пользовательских счетчиков (генераторов) в Microsoft SQL Server В MS SQL 2012 появилась CREATE SEQUENCE Тоже не без недостатков подход, конечно...
1
|
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 2
|
|
12.10.2012, 20:01 | 11 |
Это смотря в какой момент определять значение ключа. Вычислять и присваивать уникальный идентификатор надо уже после того как пользователь завел все необходимые данные и нажал кнопку "сохранить\ввести", т.е. никаких очередей связанных с действием человека.
0
|
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
|
|
12.10.2012, 20:15 | 12 |
0
|
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 2
|
|
15.10.2012, 14:08 | 13 |
А кто еще может нажать эту кнопку если запись новая(!), т.е. только предполагается к вводу данным пользователем и ни для кого другого её просто нет?!
Если же производится корректировка записи, например, как сформулировано в условиях примера заглавного поста, для ручного ввода уникального идентификатора, то блокировать запись на изменение(но не на чтение) кем-либо другим - норма и здесь проверки на корректность введенного вручную уникального идентификатора и его в апдейт в записи также требуют минимального времени определяемого только быстродействием системы (не раздумьями оператора) ибо только на этот краткий момент будет ставится полная локировка. Обе ситуации при этом не мешают кому-либо иному в то же время добавлять как новые записи, так и редактировать старые.
0
|
1929 / 1164 / 423
Регистрация: 31.05.2012
Сообщений: 4,116
|
|
15.10.2012, 14:49 | 14 |
0
|
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
|
|
15.10.2012, 18:27 | 15 |
0
|
15.10.2012, 18:27 | |
15.10.2012, 18:27 | |
Помогаю со студенческими работами здесь
15
Генератор 25 уникальных чисел Генератор уникальных идентификаторов Генератор уникальных чисел c++ Генератор уникальных комбинаций Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |