|
Программирование >> Руководство по sql
Нахождение максимального значения и добавление 1 Самый интуитивный подход заключается в нахождении текущего максимального значения, добавлении к нему 1 и вставке результата в таблицу sales: SQL: insert sales select max(sonum) + 1, 8042, 66, Apr 22 1993 from sales Теперь данные примут следующий вид: SQL: select * from sales Результат:
Этот подход годится для простых приложений. Совсем другое дело, если в вашей системе одновременно работает множество пользователей. Как предотвратить одновременный доступ к этой таблице двух пользователей? Уникальный индекс для sonum, конечно, помогает, но за это придется расплачиваться снижением производительности. Один способ увеличить ваши шансы на успех заключается в том, чтобы поместить в транзакцию оператор INSERT: SQL: begin transaction insert sales select max(sonum) + 1, 8042, 66, Apr 22 1993 from sales commit transaction Если в вашей системе базы данных обеспечивается механизм блокировки, контролируемой пользователем (например, HOLDLOCK, как в Transact-SQL), поэкспериментируйте с ним. Это может обеспечить и дополнительную защиту от возможности генерации дублирующихся ключей, когда база данных используется особенно интенсивно. SQL: begin transaction insert sales select max(sonum) + 1, 8042, 66, Apr 22 1993 from sales holdlock commit transaction Конфликт между двумя и более пользователями по-прежнему возможен. В зависимости от того, как реализована ваша система, не исключено, что вам потребуется написать код для обработки ошибок и взаимоблокировок. Использование отдельной таблицы ключей Еще один метод заключается в использовании отдельной таблицы для записи максимального значения последовательного поля (в нащем случае - sonum). Это уменьшает вероятность соревнований за захват таблицы и опасность взаимоблокировки. Сначала создайте таблицу, которая будет содержать текущий максимальный последовательный номер: SQL: create table maxnum (sonum int) Поскольку вы будете обновлять таблицу (изменяя существующие значения), то должны инициализировать ее с помощью какого-то значения (например, 1): SQL: insert maxnum values(l) select * from maxnum Результат: sonum Теперь можно использовать транзакцию для нахождения максимального значения sonum в таблице sales, сохранить это значение в maxnum, а затем обновить таблицу sales (запросы включены только для того, чтобы показать содержимое этих двух таблиц в ходе процесса): SQL: begin transaction insert maxnum select max(sonum) + 1 from sales insert sales select max(maxnum.sonum), test, test, May 1 1993 from maxnum select * from sales commit transaction Результат: sonum
Использование произвольного значения Оба предыдущих метода - поиск с помошью функции max(sonum) в целевой таблице и получение этого значения из отдельной таблицы ключей - имеют недостатки. Первый, как отмечалось, может привести к конфликтам между пользователями. Второй может превратиться в узкое место : для каждого INSERT нужен INSERT, SELECT и снова INSERT. Этой проблемы можно избежать, воспользовавшись произвольным значением, таким как дата или время. Если в вашей системе предусмотрено использование временной отметки, это может оказаться именно тем, что вам нужно. Другой подход заключается в генерации такого числа: используйте результат формулы, которая вычисляет какое-либо произвольное или уникальное значение. Этот произвольный подход имеет свои собственные проблемы. Если вам действительно необходим последовательный номер, этот метод не удовлетворит ваших потребностей. Выполнение сортировки может оказаться весьма накладным, поскольку данные не упорядочены. Если вы планируете генерировать уникальные идентификационные номера, сравните недостатки, присущие этому методу, с потребностями вашего приложения. КАК ИЗБЕЖАТЬ ОШИБОК в следующей главе также используется материал из Internet. В ней перечислены некоторые распространенные ошибки с пояснениями, почему они возникают, и рекомендациями, как их избежать. о = го:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |