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


bushmen   (2004-05-14 14:49:00) [21]

>А это к какой таблице(полю/генератору/последовательности)относится?

Если Вам это интересно, то на www.sql.ru обсуждался этот вопрос.


Skyle   (2004-05-14 14:47:00) [22]

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.
К последней, которую трогали.


Курдль   (2004-05-14 14:45:00) [23]


> SELECT @Id = @@IDENTITY

А это к какой таблице(полю/генератору/последовательности)относится?


bushmen   (2004-05-14 14:42:00) [24]

>Возможно я поэтому на нем и не работаю

Мало ли что кто делает вообше - вопрос был задан конкретно про MS SQL 2000. А о Ваших личных предпочтениях я осведомился в Вашем вчерашнем посте по поводу транзакций.


paul_k   (2004-05-14 14:41:00) [25]

Курдль ©   (14.05.04 14:33) [30]
не будем спорить на что, ни за что садится. Все от задачи пляшет.

Курдль ©   (14.05.04 14:30) [29]
а зачем заранее? достаточно добавить все в правильной последовательности и взять @@identity после каждого инсерта.
тогда и танцы с бубном отплясывать вокруг таблиц не надо.
Тем более когда нужно всего лишь расставить связи и дальше пользовать эти поля для сортировки не предвидится, то мое мнение - uniqueidentifier с NewId() в качестве defaultValue вполне подходит


Skyle   (2004-05-14 14:41:00) [26]


> Можно конкретнее?
> Если у меня есть форма с 4-мя ДатаСэтами, ну например, "субъекты"
> и я ввожу нового физ.лица

А если вот так?
Отправляешь запрос такого вида:
BEGIN TRAN
 DECLARE @Id INT

 INSERT FirstTable(....)
 VALUES(.....)

 SELECT @Id = @@IDENTITY

 --А дальше вставка всего остального с использованием @Id.
 -- Это замечательно работает в случае динамического формирования запроса.


Курдль   (2004-05-14 14:39:00) [27]


> Если Вы работаете на MS SQL 2000, то проще всего загнать
> все данные в хранимую процедуру, а там через SCOPE_IDENTITY()
> получить номер identity-поля.

Возможно я поэтому на нем и не работаю. Для задачи [29] я просто беру значение первичного (для 1) /внешнего (для 2-4) ключа способом [24] ( поправить ошибку в конце - не имя_таблицы, а имя_генератора) и прописываю, куда надо.


bushmen   (2004-05-14 14:34:00) [28]

Если Вы работаете на MS SQL 2000, то проще всего загнать все данные в хранимую процедуру, а там через SCOPE_IDENTITY() получить номер identity-поля.


Курдль   (2004-05-14 14:33:00) [29]


> Только я Вот вижу Sybase  и сразу почемуто в любимый ASE
> (Adaptive Server Enterprise) проверять лезу. А там - обшибка
> синтаксиса..

ASA тоже очень быстро прогрессировала, посмотрите и Вы апгрэйды.
В 8.0 еще этого не было, а в 8.1 не было UUID., появилось только в 8.2 (и все за год-два).
Но я не вижу смысла в ASE, не лучше ли сразу на Оракл садиться?


Курдль   (2004-05-14 14:30:00) [30]


> Это можно сделать иначе и совсем несложно...

Можно конкретнее?
Если у меня есть форма с 4-мя ДатаСэтами, ну например, "субъекты" и я ввожу нового физ.лица:
1. Заполняю ФИО (таблица "Субъекты")
2. Ввожу адрес (таблица "Адреса")
3. Ввожу телефон (таблица "Телефоны")
4. Ввожу счет в банке (таблица "Счета")
Причем все записи во всех таблицах новые, а таблицы 2-4 связаны с 1 по первичному ключу?


paul_k   (2004-05-14 14:29:00) [31]

2Курдль
Да догадался потом я что Вы на ASA работаете..
Только я Вот вижу Sybase  и сразу почемуто в любимый ASE (Adaptive Server Enterprise) проверять лезу. А там - обшибка синтаксиса..


Skyle   (2004-05-14 14:25:00) [32]

Я не знаю задачи, для которой нужно заранее знать значение первичного ключа.


> Например для того, чтобы сформировать пакет записей для
> связанных по этому идентификатору таблиц.

Это можно сделать иначе и совсем несложно...


Курдль   (2004-05-14 14:23:00) [33]

Да? На ASA 8.1 уже есть!
Adaptive Server Anywhere SQL Reference Manual
 3. SQL Functions
   Alphabetical list of functions

GET_IDENTITY function [Miscellaneous]

--------------------------------------------------------------------------------

Function
Allocates values to an autoincrement column. This is an alternative to using autoincrement to generate numbers.

Syntax
GET_IDENTITY ( [ owner.] table-name [, num_to_alloc ],... )


paul_k   (2004-05-14 14:20:00) [34]

кстати о Sybase
Sybase ASE 12
'GET_IDENTITY' is not a recognized built-in function name.


Курдль   (2004-05-14 14:18:00) [35]

Чаще всего такие вопросы возникают при необходимости получить значение нового идентификатора заранее. Например для того, чтобы сформировать пакет записей для связанных по этому идентификатору таблиц. Не знаю, как в MSSQL, но для 3х СУБД это так:

Sybase: select GET_IDENTITY('имя таблицы') as NEW_ID from DUMMY
Oracle: select имя_последовательности.NEXTVAL NEW_ID from DUAL
InterBase: select GEN_ID('имя таблицы', 1) from rdb$database


Skyle   (2004-05-14 14:08:00) [36]


> А есть на чем проверить? Просто по аналогии с Sybase. Вдруг
> MS SQL это от нее тоже уеаследовал?


Нет, такого нет.
А какую задачу решаем? Если хочется просто найти следующее_значение_на_момент_запроса, то это можно сделать и выборкой.
Но в случае многопользовательской работы это нифига не спасёт.

Спасёт только в том случае, когда это значение будет зарезервированоклиентом для этой записи. Но это уже нифига не первичный ключ.


Курдль   (2004-05-14 14:00:00) [37]

А есть на чем проверить? Просто по аналогии с Sybase. Вдруг MS SQL это от нее тоже уеаследовал?


paul_k   (2004-05-14 13:59:00) [38]

Если верить хелпу GET_IDENTITY в МсСкул не известна


Курдль   (2004-05-14 13:53:00) [39]

А такая фишка в MSSQL-е не проходит:
select GET_IDENTITY('имя таблицы') as NEW_ID from DUMMY?


paul_k   (2004-05-14 13:41:00) [40]

выкрутится можно следующим путем
CREATE TABLE t_all_ids (
id numeric(18, 0) IDENTITY (1, 1) NOT NULL,
user_login numeric(18, 0) IDENTITY (1, 1) NOT NULL,
)

go

create procedure GetId New_Id numeric  output
as
begin tran
insert into t_all_ids (user_login)
select suser_sname()
set New_Id =  @@identity
Commit tran
go
и когда нужно получить новый ID - исполнять подобную процедуру.
Вопрос в том, а всегда ли нужен такой танец с бубном или можно обходится без него


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

Наверх

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