2015-09-16 8 views
0

Я видел что-то вроде этого несколько раз, но не совсем в этой конфигурации. У меня есть таблица, которая имеет отношение один к большому.SQL Delete vs Update

Предположим, у меня есть компьютерный стол и таблица деталей. Пользователь вводит общую информацию в таблицу компьютеров, затем выбирает части, которые хранятся в таблице деталей, с отношением к компьютерной таблице computerId. Итак, оригинальная запись - простая вставка. Теперь предположим, что пользователь снова выбирает компьютер и меняет часть на ПК, добавляет некоторые новые, удаляет некоторые и обновляет несколько. Затем пользователь нажимает «Сохранить», чтобы сохранить изменения. Я запускаю простое обновление на компьютерном столе, но теперь проблема с таблицей деталей.

Было бы лучше удалить все записи из таблицы деталей для идентификатора компьютера, а затем сделать чистую вставку всех выбранных частей. Или запустите какой-либо метод, который будет смотреть на существующие части таблицы и где часть была обновлена, обновить запись, где часть больше не существует, удалить, а затем вставить остальные части?

+0

Я думаю, что стандартным процессом было бы обновление компьютера отдельно от каждой части и обновление частей по одному. – Beth

ответ

1

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

В условиях высокой громкости я следующее
Там нет обновления - то есть просто игнорировать
- удалять элементы пошли
- игнорировать любые элементы не изменились
- вставить новые элементы
И вы можете сделайте это за один проход два/три заявления.
Или вы можете определить хранимую процедуру.
Сделайте сначала удаление перед вставкой, чтобы очистить пространство.

Вы можете получить реальную фантазию и использовать обновление для удаления/вставки, но это просто становится более сложным, чем это стоит на уме. У вас все равно будет вставка или удаление, если количество элементов не совпадает.

delete comp_part 
where compID = @compID and partID not in (....); 

Вставка немного сложнее:
Вы можете к нему с серией вкладышей, и если у вас есть ПК просто дайте Вкладыш неудачу
Другой способ заключается в создании @table и использовать его как для удаления, так и для вставки

Это стоит того, чтобы у вас был ДЕЙСТВИТЕЛЬНО занятый стол.

+0

Большая проблема, которую я пытался выяснить, - это то, что записи добавляются, меняются и удаляются. Я удаляю proc, чтобы сначала удалить все записи дочерней таблицы, а затем вставить новые записи, если бы они были быстрее или бы все циклы из существующих записей из них выполнялись через них, выполняли сравнение, чтобы определить, какие действия следует предпринять, а затем предпринять соответствующие действия похоже, что это займет больше времени. – Luckbox72

+0

Вы делаете это с соединением или существует. Я опубликую простой. – Paparazzi

+0

извините, ударил этот пост случайно. Он был исправлен – Luckbox72

0

Все зависит от бизнес-модели, если вы хотите отслеживать транзакцию, а не ее удалять. Если у вас есть все ваши старые транзакции с вашими клиентами, чем это было бы полезно для отслеживания. Ваш CustomerID будет Primarykey, и вы можете иметь еще один уникальный ключ как PartOrderID, который будет уникальным значением для каждой вставки.

Надеется, что это помогает

0

Действительно, у вас должно быть три таблицы. Продукт, Part и ProductPart; в таблице ProductPart будет храниться ассоциация «этот продукт имеет эти части». Что касается обновления, самым простым было бы удалить все ProductParts для данного Продукта и вставить нужные записи.

Смежные вопросы