Как контролировать порядок выполнения запроса на обновление? - PullRequest
0 голосов
/ 10 апреля 2009

У меня есть таблица в MS SQL 2005. И я хотел бы сделать:

update Table
set ID = ID + 1
where ID > 5

И проблема в том, что ID является первичным ключом, и когда я делаю это, у меня появляется ошибка, потому что, когда этот запрос приходит в строку с ID 8, он пытается изменить значение на 9, но в этой таблице есть старая строка значение 9 и есть нарушение ограничения.

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

Так что нет для ID = 1,2,3,4 и т. Д., А скорее ID = 98574 (или еще), а затем 98573, 98572 и т. Д. В этой ситуации нарушения ограничений не будет.

Так как же контролировать порядок выполнения обновления? Есть ли простой способ сделать это программно?

Ответы [ 4 ]

2 голосов
/ 10 апреля 2009

Transact SQL откладывает проверку ограничения до завершения инструкции.

Вот почему этот запрос:

UPDATE  mytable
SET     id = CASE WHEN id = 7 THEN 8 ELSE 7 END
WHERE   id IN (7, 8)

не подведет, хотя он поменяет id s 7 и 8.

Похоже, что после завершения запроса остаются некоторые повторяющиеся значения.

1 голос
/ 10 апреля 2009

Попробуйте это:

update Table
set ID = ID * 100000 + 1
where ID > 5

update Table
set ID = ID / 100000
where ID > 500000
0 голосов
/ 10 апреля 2009

Лично я бы не обновлял поле идентификатора таким образом, я бы создал рабочую таблицу от старой до новой таблицы. Он хранит оба идентификатора, а затем все обновления сделаны из этого. Если вы не используете каскадное удаление (которое может случайно заблокировать ваши таблицы на долгое время), начните с дочерних таблиц и продолжайте работу, в противном случае начните с таблицы pk. Не делайте этого, если вы не находитесь в однопользовательском режиме, или у вас могут возникнуть неприятные проблемы с целостностью данных, если другие пользователи вносят изменения, пока таблицы не соответствуют друг другу.

PK - это не то, что нужно дурачить с изменением, и если это вообще возможно, не следует менять.

Прежде чем вносить какие-либо изменения в производственные данные таким образом, обязательно сделайте полную резервную копию. Если ты не справишься с этим, это может стоить тебе работы.

0 голосов
/ 10 апреля 2009

Не забывайте скобки ...

Обновление таблицы установить ID = (ID * 100000) + 1 где ID> 5

Если идентификаторы становятся слишком большими, вы всегда можете использовать цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...