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

Откуда:
Сообщений: 12
Добрый день. Речь пойдёт о базе под SQL Server Compact.

Есть таблица вида.

CREATE TABLE MyTable(
	[Order] int NOT NULL,
	CONSTRAINT UQ_MyTable_ParentId_Order UNIQUE ([Order]),
)
GO

Как видите, в таблице всего одно численное поле [Order], но включенное в уникальный ключ. Данные в таблице, ну например, такие:

Order
-----------
1
2
3
4
5
6
7
8
9
10

Задача очень проста. Необходимо сдвинуть значения колонки [Order] на единицу одним запросом. Тоесть, грубо говоря, прибавить к каждому значению 1.

Ха! Казалось бы, что может быть проще? Нужен вот такой простейший запрос:

UPDATE  MyTable
SET       [Order] = [Order] + 1

Но на самом деле запрос падает вот с такой ошибкой: A duplicate value cannot be inserted into a unique index.

Оказывается, что команда в цикле идёт от начала до конца (в зависимости от порядка индекса) и тупо пытается прибавить еденичку к значению. Естественно, что оно наворачивается на первой же итерации, пытаясь прибавить к первой записи 1, а ведь 2 уже существует.

Можно поменять порядок индекса, но соль в том, что мне нужно двигать как вверх, так и вниз, поэтому это создаст такую же проблему, но уже на попытке сделать декремент.

Ещё можно тупо в цикле делать по одному запросу на строку, но сами понимаете, какой это рагулизм.

Вопрос - как все же сделать это одним запросом? Спасибо!
16 июл 09, 15:40    [7424777]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг диапазона значений таблицы в SQL Server Compact.  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
UZ
Вопрос - как все же сделать это одним запросом? Спасибо!

можно двумя:
DELETE FROM MyTable  
WHERE [Order]=(SELECT Min([Order]) FROM MyTable);

INSERT INTO MyTable 
SELECT Max([Order]) + 1 FROM MyTable;
16 июл 09, 16:22    [7425205]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг диапазона значений таблицы в SQL Server Compact.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
UPDATE  MyTable
SET       [Order] = 11
WHERE [Order] = 1
16 июл 09, 16:27    [7425233]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг диапазона значений таблицы в SQL Server Compact.  [new]
UZ
Member

Откуда:
Сообщений: 12
qwrqwr,

так проапдейтится только одна запись, а мне надо модифицировать целую выборку
16 июл 09, 16:50    [7425441]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг диапазона значений таблицы в SQL Server Compact.  [new]
UZ
Member

Откуда:
Сообщений: 12
qwrqwr, Паганель, спасибо за ответы, конечно, но вы в суть вопроса войти пробовали? :)
16 июл 09, 16:52    [7425456]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг диапазона значений таблицы в SQL Server Compact.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Рекомендации гласят:
Пункт 6
...Подумайте также над тем, чтобы описать решаемую Вами задачу целиком.
Возможно, что тот способ решения, который Вы стремитесь воплотить в жизнь,
не является наилучшим, а лишь кажется Вам таковым.
Кажется, это Ваш случай
16 июл 09, 16:53    [7425465]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг диапазона значений таблицы в SQL Server Compact.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
В отличие от старших редакций, ограничения в компакте нельзя отключить. Сносите, апдейте, снова ставьте.
16 июл 09, 16:53    [7425468]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг диапазона значений таблицы в SQL Server Compact.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

если все значения неотрицательные, можно двумя update-ами извернуться:

update MyTable
set [Order] = -[Order]

update MyTable
set [Order] = -[Order] + 1

Posted via ActualForum NNTP Server 1.4

16 июл 09, 17:02    [7425528]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг диапазона значений таблицы в SQL Server Compact.  [new]
UZ
Member

Откуда:
Сообщений: 12
daw,

шикарно!! как же я сам не додумался?

с меня танкер нефтей, спасибо.
16 июл 09, 17:11    [7425594]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить