Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Инструкция Update временно обойти огрничение на уникальность  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Всем добрый день!

Может кто подскажет как во время обновления обойти ограничение на уникальность?

Поясню, есть индекс на уникальность по 3 полям: Page, REF_REV, RefList. Сделано для того чтобы Page был всегда уникален в пределах REF_REV и RefList.

Во время выполнения скрипта
      UPDATE ListVolume
      SET PAGE = CASE
                   WHEN ID_LISTVOLUME = @ID_IN THEN @SPage
                   ELSE PAGE - 1
                 END
      FROM (SELECT LV.ID_LISTVOLUME FROM ListVolume LV
            WHERE REF_REV = @LIMIT
              AND ISNULL(Ref_ListVolume, -1) = -1
              AND PAGE BETWEEN @SPage AND @EPage
            ORDER BY PAGE DESC) AS lv
      WHERE lv.ID_LISTVOLUME = ListVolume.ID_LISTVOLUME


надо обойти проверку на уникальность, может кто подскажет варианты?
15 окт 14, 15:44    [16708264]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37155
Удалить/отключить уникальный индекс или констрейнт.
Или поправить код, чтобы он не писал дубликаты.
15 окт 14, 15:46    [16708280]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4805
Обойти на время апдейта? Зачем? А после апдейта там опять всё будет правильно?

Вот это вам надо?
ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column
ALTER TABLE foo CHECK CONSTRAINT FK_something
15 окт 14, 15:48    [16708297]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
vso
Member

Откуда: СПб
Сообщений: 270
a_voronin
Обойти на время апдейта? Зачем? А после апдейта там опять всё будет правильно?


Чтобы просто пересортировать значения.
15 окт 14, 15:56    [16708368]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Веткин Сергей
a_voronin
Обойти на время апдейта? Зачем? А после апдейта там опять всё будет правильно?


Чтобы просто пересортировать значения.
При чём тут "пересортировать"??
15 окт 14, 16:24    [16708656]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
vso
Member

Откуда: СПб
Сообщений: 270
iap,

ну мне надо, скажем, поднять страницу выше, а номер по порядку и признак сортировки это одно и тоже
15 окт 14, 16:27    [16708687]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Веткин Сергей
iap,

ну мне надо, скажем, поднять страницу выше, а номер по порядку и признак сортировки это одно и тоже
И что же, апдейтите по одной записи что ли?
Почему сразу не проапдейтить всё, что надо?
15 окт 14, 16:33    [16708748]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
vso
Member

Откуда: СПб
Сообщений: 270
iap,

я же привел код как я делаю
15 окт 14, 16:56    [16708967]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
Konst_One
Member

Откуда:
Сообщений: 11568
это вы так пейджинг что ли пытаетесь реализовать?
может поищите решение через CTE
15 окт 14, 17:01    [16709007]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Веткин Сергей
iap,

я же привел код как я делаю
Посмотрел.
А что это за ORDER BY в подзапросе? Зачем?
15 окт 14, 17:12    [16709076]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
vso
Member

Откуда: СПб
Сообщений: 270
iap,

Чтобы приращение начиналось с максимального значения. Т.е. я присваиваю максимальному значению минимальное, а потом последовательно сдвигаю последующие значения
15 окт 14, 17:52    [16709397]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
Konst_One
Member

Откуда:
Сообщений: 11568
Declare @PageNumber int = 3, @PageSize int = 2
declare @Table as table (Id int primary key)
insert into @Table (Id) select 1 as id union all select 2 union all select 3 union all select 4 union all select 5

declare @Offset int
set @Offset = (@PageNumber - 1) * @PageSize + 1

--ROW_NUMBER with CTE and JOIN
with T as 
(select Id, row_number() over (order by Id desc) as row_number
		from @Table)
select T1.* 
	from T join @Table T1 on T.Id = T1.Id
	where row_number between @Offset and @Offset + @PageSize - 1;
15 окт 14, 17:55    [16709414]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Веткин Сергей,

Если версия сервера позволяет

DECLARE @StartingRowNumber tinyint = 1
      , @FetchRows tinyint = 8;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC 
    OFFSET @StartingRowNumber ROWS 
    FETCH NEXT @FetchRows ROWS ONLY;
15 окт 14, 19:02    [16709733]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция Update временно обойти огрничение на уникальность  [new]
vso
Member

Откуда: СПб
Сообщений: 270
WarAnt, к сожалению версия не проходит.

Но если Вам не трудно, подскажите как это поможет обойти уникальный индекс?
15 окт 14, 23:04    [16710858]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить