Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Уникальные значения в MSSQL 2000


Страницы:   1 2 3

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо