Как генерить уникальное поле(int) во время INSERT (MS SQL) - CodeHelper

Как генерить уникальное поле(int) во время INSERT (MS SQL)

1

Задача состоит в том, что у некоторого набора данных должен быть номер, который зависит от пользователя. Так вот нужно сделать INSERT, который сгенерит уникальный id, обязательно int, в зависимости от пользователя.

Новые ответы


0

Пока как решения на ум пришло использование максимальной блокировке транзакции

Как то так:

DECLARE @maxId int
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION ins
    	SET @maxId = (SELECT ISNULL(MAX([some_id]),0) + 1
    			FROM [mapping]
    			WHERE [user_id] = @user_id)

    	INSERT INTO [mapping] 
    		([some_id]
    		,[user_id]) 
    	VALUES 
    		(@maxId
    		,@user_id) 
    	SELECT	@id = SCOPE_IDENTITY()
    COMMIT TRANSACTION ins
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

и затем полученный id успользуется при вставке пар ключ->значение в другую таблицу

Senya_L

Накладывать эксклюзивную блокировку на таблицу... хмм... вряд ли это хорошая идея в многопользовательской среде. Понижаем гранулярность:

begin tran; GO

        DECLARE @maxId int

        SET @maxId = (SELECT ISNULL(MAX([some_id]),0) + 1
                        FROM [mapping] with(xlock)
                        WHERE [user_id] = @user_id)
..........................
GO
commit tran;
Senya_L

и затем полученный id успользуется при вставке пар ключ->значение в другую таблицу

Такие вещи лучше делать в одной транзакции с генерацией id

Sergey

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

Senya_L

И что из написанного вызвало раздражение уважаемого аффтара? Что блокировать всю таблицу и сериализовать все обращения к ней (в том числе и SELECT-ы, между прочим) - это порочная практика?

Мне, честно говоря, фиолетово, как Вы напроектировали свою БД, я лишь предложил техн. прием, понижающий конфликты блокировок (хинт XLOCK в данном случае). И вообще, лучше создать отдельную таблицу под счетчики для [some_id].


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.