2012-05-28 10 views
9

Posiadam sprzęt sieciowy podłączony do wielu sieci/VLans (A, B & C) oraz inny sprzęt podłączony do jednej z sieci. Kiedy usuwam lub zamieniam sieć, muszę zaktualizować moją bazę danych, aby odzwierciedlić, do czego jest podłączony sprzęt, więc próbuję napisać instrukcję mysql, aby to zrobić, ale korzystam z różnych blokad.Czy można scalić dwa rekordy za pomocą instrukcji "usuń z"?

Moja tabela ma tylko dwa pola i nie może być duplikatów. Mój przykład dane

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

Jak mogę połączyć się z siecią A do sieci B więc powyższa tabela będzie wyglądać ...

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

moja wstępna próba była tylko set network = 'B' where network = 'A', następnie DELETE network 'A' rachunku ale to tworzyłoby duplikaty, co nie jest dozwolone w tym stole - nawet jeśli duplikaty byłyby krótkie. Korzystając z alternatywnych metod, po prostu nie mogę uruchomić instrukcji mysql za pomocą instrukcji WHERE EXISTS i różnych FROM (SELECT). Czy można to zrobić w pojedynczym komunikacie mysql? Czy potrzebuję dwóch?

Każda pomoc jest doceniana.

Odpowiedz

10

Można użyć UPDATE IGNORE z wyciągu Update - to byłoby pominąć żadnych nowości, które spowodowały duplikatów. Następnie wykonaj to za pomocą DELETE, aby wyczyścić wiersze, które zostały pominięte. Na przykład:

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

Z documentation:

ze słowem kluczowym IGNORE, oświadczenie aktualizacja nie przerwać, nawet jeśli występują błędy podczas aktualizacji. Wiersze, w których występują konflikty kluczy zduplikowanych , nie są aktualizowane. Wiersze, dla których kolumny są aktualizowane do wartości , które spowodowałyby, że błędy konwersji danych zostałyby zaktualizowane do najbliższych wartości prawidłowych .

+0

To działało idealnie, dziękuję! – JonDoeCA

5

Zamiast dwóch kolumn, można rozważyć uczynić go trzy kolumny jako
(unikalny klucz pozostaną niezmienione)

  • deviceID
  • sieć
  • stanu (1,0)

, więc za każdym razem, gdy urządzenie zostało usunięte/wymienione,
następnie można oznaczyć status na 0,
oczywiście przy sprowadzaniu poprawnego guide status=1 jest wymagane

+0

Zabawiam się przy użyciu tej metody i użyłem jej w przeszłości, ale tym razem miałem nadzieję uniknąć tego. Nie chciałem wprowadzać modyfikacji na innych stronach/kodach, aby uwzględnić nowy sposób obsługi nowej struktury tabeli. Dzięki za odpowiedzi! – JonDoeCA

Powiązane problemy