Обновление нескольких строк, которые в конфликте с уникальным индексом

StackOverflow https://stackoverflow.com/questions/2593223

  •  25-09-2019
  •  | 
  •  

Вопрос

Я использую Microsoft SQL Server, и у меня есть сценарий Master-Detail, где мне нужно хранить порядок деталей. Таким образом, в таблице деталей у меня есть идентификатор, мастерство, положение и некоторые другие столбцы. Существует также уникальный индекс на мастерме и позиции. Он работает нормально, кроме одного случая: когда у меня есть некоторые существующие детали, и я меняю свой заказ. Например, когда я изменяю деталь на положении 3 с детализацией в положении 2. Когда я сохраняю деталь на положении 2 (что в базе данных имеет положение, равное 3) SQL Server Playests, поскольку ограничение уникальности индекса.

Как решить эту проблему разумным способом?

заранее спасибо
Лукаш Глаз

Это было полезно?

Решение

Это классическая проблема, и ответ прост: если вы хотите переместить элемент 3 на позицию 2, вы должны сначала изменить колонку сортировки 2 на временное число (например, 99). Так идет так:

Move 2 to 99
Move 3 to 2
Move 99 to 3

Однако вы должны быть осторожны, однако, что ваше временное значение никогда не используется в обычной обработке, а вы уважаете несколько потоков, если применимо.

Обновлять: BTW - Один из способов борьбы с «несколькими пользователями может изменять проблему заказа» - это делать то, что я делаю: дайте каждому пользователяму пользователю, а затем добавить это на временное число (мой идентификатор персонала на самом деле является уникальным идентификатором Идентификатор от стола персонала, используемого для логинов ворот). Таким образом, например, если ваши позиции никогда не будут отрицательными, вы можете использовать -1000 - userId как ваше временное значение. Поверьте мне на одну вещь, хотя: вы делаете нет Хотите просто предположить, что у вас никогда не будет столкновение. Если вы думаете это и один делает Имеется, что это будет чрезвычайно трудно отладить!

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

Во-первых, вы можете изменить существующие поля сортировки всего набора на новый набор неистовских значений (например, -100 - (PALTID * MAXSESSIZE) + SOUSTORDORDERVALVAL), а затем пройдите запись-запись и измените каждую запись на новый Ценность заказа.

Или вы можете по существу, относиться к этому как пузырь, сортируйте на массиве, где стоимость заказы является эквивалентом индекса вашего массива. Либо это имеет смысл для вас смыслом (и очевидно) или вы должны придерживаться решения 1 (что легче в любом событии).

Другие советы

Вы можете просто удалить уникальное ограничение (но оставьте клавишу индекса) в столбце «Заказ» и убедитесь, что уникальность в вашем коде, если это необходимо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top