Программирование >>  Руководство по sql 

1 ... 78 79 80 [ 81 ] 82 83 84 ... 105


Нахождение максимального значения и добавление 1

Самый интуитивный подход заключается в нахождении текущего максимального значения, добавлении к нему 1 и вставке результата в таблицу sales:

SQL:

insert sales

select max(sonum) + 1, 8042, 66, Apr 22 1993 from sales

Теперь данные примут следующий вид: SQL:

select * from sales

Результат:

sonum

stor id

ponum

sdate

7066

QA7442.3

Sep 13 1985 12

: 00AM

7067

D4482

Sep 14 1985 12

: 00 AM

7131

N914008

Sep 14 1985 12

: 00AM

7131

N914014

Sep 14 1985 12

: 00AM

8042

423LL922

Sep 14 1985 12

: 00AM

8042

Apr 22 1993 12

: 00AM

Этот подход годится для простых приложений. Совсем другое дело, если в вашей системе одновременно работает множество пользователей. Как предотвратить одновременный доступ к этой таблице двух пользователей? Уникальный индекс для 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

sonum

stor id

ponum

sdate

7066

QA744~273~

зёр ГзТ985~Г2~

: 00AM

7067

D4482

Sep 14 1985 12

: 00AM

7131

N914008

Sep 14 1985 12

: 00AM

7131

N914014

Sep 14 1985 12

: 00AM

8042

423LL922

Sep 14 1985 12

: 00AM

8042

Apr 22 1993 12

: 00AM

test

test

May 1 1993 12 :

00AM



Использование произвольного значения

Оба предыдущих метода - поиск с помошью функции max(sonum) в целевой таблице и получение этого значения из отдельной таблицы ключей - имеют недостатки. Первый, как отмечалось, может привести к конфликтам между пользователями. Второй может превратиться в узкое место : для каждого INSERT нужен INSERT, SELECT и снова INSERT.

Этой проблемы можно избежать, воспользовавшись произвольным значением, таким как дата или время. Если в вашей системе предусмотрено использование временной отметки, это может оказаться именно тем, что вам нужно. Другой подход заключается в генерации такого числа: используйте результат формулы, которая вычисляет какое-либо произвольное или уникальное значение.

Этот произвольный подход имеет свои собственные проблемы.

Если вам действительно необходим последовательный номер, этот метод не удовлетворит ваших потребностей.

Выполнение сортировки может оказаться весьма накладным, поскольку данные не упорядочены.

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

КАК ИЗБЕЖАТЬ ОШИБОК

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

о = го:



1 ... 78 79 80 [ 81 ] 82 83 84 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика