2012-05-28 4 views
9

У меня есть сетевое оборудование, которое подключено к нескольким сетям/VLans (A, B & C) и другому оборудованию, которое только что подключено к одной из сетей. Когда я удаляю или заменяю сеть, мне нужно обновить мою базу данных, чтобы отразить, к чему привязано оборудование, поэтому я пытаюсь написать инструкцию mysql для этого, но я сталкиваюсь с различными дорожными блоками.Можно ли объединить две записи с помощью инструкции «удалить из»?

В моей таблице есть только два поля, и не может быть дубликатов записей. Мой пример данных

deviceID network 
1  A 
1  B 
1  C 
2  B 
2  C 
3  A 
4  A 
5  B 

Как я могу объединить сети A в сеть B, поэтому выше таблица будет выглядеть ...

deviceID network 
1  B 
1  C 
2  B 
2  C 
3  B 
4  B 
5  B 

Моя первая попытка была просто set network = 'B' where network = 'A', а затем DELETE network 'A' заявление но это создало бы дубликаты, которые не разрешены для этой таблицы, хотя дубликаты были бы краткими. Используя альтернативные методы, я просто продолжаю работать в неудачных операциях mysql, используя WHERE EXISTS и различные операторы FROM (SELECT). Можно ли сделать это в одном выражении mysql? Мне нужны два?

Любая помощь приветствуется.

ответ

10

Вы можете использовать UPDATE IGNORE с вашим утверждением обновлений - это пропустить бы любые обновления, которые вызвали дубликаты. Затем вы должны следовать этому с помощью DELETE, чтобы очистить строки, которые были пропущены. Например:

UPDATE IGNORE mytable SET network = 'B' WHERE network = 'A'; 
DELETE FROM mytable WHERE network = 'A'; 

От documentation:

С IGNORE ключевое слово, оператор обновления не прервана, даже если возникают ошибки во время обновления. Строки, для которых конфликты с дубликатными ключами не обновляются. Строки, для которых столбцы обновляются до значений , которые будут вызывать ошибки преобразования данных, обновляются до ближайших действительных значений.

+0

Это сработало отлично, спасибо! – JonDoeCA

5

Вместо двух столбцов, вы можете рассмотреть сделать его три колонки, как
(уникальный ключ остается неизменным)

  • DeviceId
  • сеть
  • состояния (1,0)

поэтому, всякий раз, когда устройство было удалено/заменено,
, вы затем отмечаете статус 0,
конечно, retrive правильного списка, status=1 требуется

+0

Я играл с использованием этого метода, и я использовал его в прошлом, но я надеялся избежать его на этот раз. Я не хотел вносить изменения в мои другие страницы/код, чтобы учесть новый способ обработки новой структуры таблицы. Спасибо за ответ! – JonDoeCA