![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уникальные значения в MSSQL 2000
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и когда нужно получить новый ID - исполнять подобную процедуру.
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
Вопрос в том, а всегда ли нужен такой танец с бубном или можно обходится без него