![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уникальные значения в MSSQL 2000
Mitrofan © (2004-05-13 09:22:00)Скажите, имеется ли в MSSQL 2000 механизм автоинкремента или генераторы ? Как в данной СУБД для поля организовать уникальность значений ? Спасибо.
Skyle (2004-05-14 12:07:00) [41]
> -=VaaL=- © (14.05.04 11:46) [17]
> ндааа... а теперь еще раз прочитаем цитирование хелпа 31512
> © (13.05.04 09:33) [3]
>
> @@IDENTITY and SCOPE_IDENTITY will return the last identity
> value generated in any table in the current session.
И что? Судя по
> Mitrofan (13.05.04 09:28) [2]
> А как оно работает ? Значение присваивается при вставке
> записи ?
> Могу ли я это значение получить на клиентской машине еще
> до вставкизаписи ?
IDENTITY тут никак не катит и о нём вообще речи нет.
Автор к сожалению никак не конкретизировал задачу.
Или я чего-то не понял?
-=VaaL=- (2004-05-14 11:46:00) [42]ндааа... а теперь еще раз прочитаем цитирование хелпа 31512 © (13.05.04 09:33) [3]
@@IDENTITY and SCOPE_IDENTITY will return the last identity value generated in any table in the current session.
Skyle (2004-05-14 11:40:00) [43]
> uniqueidentifier удобен, например, в случае, когда есть
> несколько баз, находящихся в разных филиалах.
С этим я спорить не буду, но в данном случае никакой нагрузки кроме обеспечения глобальной уникальности при синхронизации он не несёт.
> При добавлении строк не возникнет конфликта с уникальностью
> первичного ключа.
А на кой ему быть первичным ключом, если он используется только между базами? Пусть первичным ключом будет ID INT IDENTITY(1, 1), а UID - где-нибудь там же, но сбоку. Выскажу предположение, что индекс по ID будет веселее строиться, чем по UID.
> А по поводу использования ПК для сортировки, номера документа
> и т.п. - он не для этого предназначен. Корректнее использовать
> специальные поля.
А я как сказал? :-)
Danilka (2004-05-14 11:37:00) [44][14] Jee © (14.05.04 11:32)
А ПК, как правило, и не требуется знать довставки записи.
Конечно, пусть автор ветки скажет для чего это ему нужно, но если мой мелафон в порядке, то тогда uniqueidentifier ему не подойдет. :))
Jee (2004-05-14 11:32:00) [45]
> 31512 © (14.05.04 10:54) [11]
Спасибо за ссылку, весьма интересная статья.
> Таки Игорь прав ...
Это кто?
> Skyle © (14.05.04 11:19) [13]
uniqueidentifier удобен, например, в случае, когда есть несколько баз, находящихся в разных филиалах. И есть центральная база в офисе. Данные из филиалов собираются в центральную базу. При добавлении строк не возникнет конфликта с уникальностью первичного ключа.
А по поводу использования ПК для сортировки, номера документа и т.п. - он не для этого предназначен. Корректнее использовать специальные поля.
Skyle (2004-05-14 11:19:00) [46]
> Но за это придется поплатиться объемом данных.
И ещё, если я не ошибаюсь, без приведения типов по полю типа uniqueidentifier нельзя сортировать.
Есть примеры реализации подобных замут, но я не представляю варианта, в котором это уникальное поле должно быть первичным ключом...
Danilka (2004-05-14 11:10:00) [47][9] Jee © (14.05.04 10:22)
Только этот ID будет мало похож на автоинкремент, мягко говоря. :)
Получить автоинкрементированое значение перед вставкой записи может понадобиться, например, для автонумерации документов, а теперь представь что будет, если в номере договора напишется это самое. :))
31512 (2004-05-14 10:54:00) [48]
> Jee © (14.05.04 10:18) [8]
Таки Игорь прав ...
http://ln.com.ua/~openxs/articles/smart-questions-ru.html
Nikolay M. (2004-05-14 10:54:00) [49]
> начнет использовать значение IDENTITY в могопользовательском
> режиме и отгребет кучу ошибок.
SCOPE_IDENTITY() в большинстве случаев вполне достаточно.
Jee (2004-05-14 10:22:00) [50]
> Mitrofan (13.05.04 09:28) [2]
> А как оно работает ? Значение присваивается при вставке
> записи ?
> Могу ли я это значение получить на клиентской машине еще
> до вставки записи ?
Можно конечно и с IDENTITY сделать корректно, но придется изворачиваться, чтобы не возникло конфликтов при вставках записей с разных клиентов.
Если тебе действительно необходимо на клиентской машине перед вставкой записиполучать уникальное значение ключа, можно использовать тип uniqueidentifier у поля. А занчение получать функцией NEWID(). Но за это придется поплатиться объемом данных.
Jee (2004-05-14 10:18:00) [51]
> 31512 © (14.05.04 09:51) [7]
Мораль конечно замечательная. Таким образом можно ответить на 99% вопросов в форуме, при этом можно даже не знать ответа.
В [1] ответили достаточно для того, чтобы человек нашел сам в хэлпе.
> > если добавляются строки с нескольких клиентов
>
> ничего не сказано.
Ничего не сказано и про то, что с MSSQL 2000 в данном случае будет работать исключительно один клиент. Имхо, если используется такого класса СУБД, нужно рассчитывать на то, что это будет не так. Человек начнет использовать значение IDENTITY в могопользовательском режиме и отгребет кучу ошибок.
31512 (2004-05-14 09:51:00) [52]
> Jee ©
> И какая мораль следует из цитирования хэлпа?
Мораль сей басни такова:
Посмотрим хелп сначала,
И не найдя ответа,
Возми и умну книжку почитай
Или сходи до интернета.
И лишь потом вопросы
В форум посылай ...
31512 ©
P.S.
В [1] про
> если добавляются строки с нескольких клиентов
ничего не сказано.
bushmen (2004-05-13 13:24:00) [53]Я бы для начала поссоветовал поглубже изучить основы MS SQL Server'a, а также основы клиент-серверной технологии
Курдль (2004-05-13 09:49:00) [54]У меня есть на такие случаи общее пожелание.
1. Потратьте немного времени на ознакомление (пусть даже не углубленное изучение) CASE - технологий.
2. Установите себе какое-нибудь средство CASE хотя самый минимальный набор для работы с БД. Это может быть от тяжеловесного монстра Rational Rose до компактного PD.
3. Потренируйтесь немного в проектировании БД - от концептуальной модели - к физической и до генерации скрипта создания БД.
4. Внимательно посмотрите скрипт и вы обязательно удивитесь, как грамотно все вышло!
Т.е. если у Вас в концептуальной модели стояло поле "ID serial", то простой заменой целевой СУБД в скрипте можно получить:
- для IB - CREATE GENERATOR
- для Oracle - CREATE SEQUENCE
и т.д.
Таблицы автоматически будут снабжены всем необходимым - ключами, индексами, констрэйнтами, а ошибки будут отловлены еще до генерации самой БД.
Jee (2004-05-13 09:40:00) [55]
> 31512 © (13.05.04 09:33) [3]
И какая мораль следует из цитирования хэлпа?
@@IDENTITY, SCOPE_IDENTITY, and IDENT_CURRENT - вещи хорошие. Однако если ты сам работаешь с таблицей и если добавляются строки с нескольких клиентов, ситуации немножкоразные, не так ли?
31512 (2004-05-13 09:33:00) [56]Из справки по Transact-SQL
@@IDENTITY
Returns the last-inserted identity value.
Syntax
@@IDENTITY
Return Types
numeric
Remarks
After an INSERT, SELECT INTO, or bulk copy statement completes, @@IDENTITY contains the last identity value generated by the statement. If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL. If multiple rows are inserted, generating multiple identity values, @@IDENTITY returns the last identity value generated. If the statement fires one or more triggers that perform inserts that generate identity values, calling @@IDENTITY immediately after the statement returns the last identity value generated by the triggers. The @@IDENTITY value does not revert to a previous setting if the INSERT or SELECT INTO statement or bulk copy fails, or if the transaction is rolled back.
@@IDENTITY, SCOPE_IDENTITY, and IDENT_CURRENT are similar functions in that they return the last value inserted into the IDENTITY column of a table.
@@IDENTITY and SCOPE_IDENTITY will return the last identity value generated in any table in the current session. However, SCOPE_IDENTITY returns the value only within the current scope; @@IDENTITY is not limited to a specific scope.
IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT returns the identity value generated for a specific table in any session and any scope. For more information, see IDENT_CURRENT.
Examples
This example inserts a row into a table with an identity column and uses @@IDENTITY to display the identity value used in the new row.
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
Mitrofan (2004-05-13 09:28:00) [57]А как оно работает ? Значение присваивается при вставке записи ?
Могу ли я это значение получить на клиентской машине еще до вставки записи ?
Nikolay M. (2004-05-13 09:24:00) [58]IDENTITY