![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Nieautoryzowani Postów: 34 Pomógł: 1 Dołączył: 22.06.2009 Skąd: Koszalin/Poznań Ostrzeżenie: (0%) ![]() ![]() |
Mam dość skomplikowany problem:)
Otóż mam tabelę 'router'
Sprawa wygląda tak, że jest sobie skrypt który zbiera informacje o fałszywych trasach w routingu. Te informacje są wysyłane z routerów do skryptu co 15 minut. Gdy na jakimś routerze pojawi się fałszywa trasa, jest ona ciągle wysyłana do skryptu zbierającego informacje, ten z kolei dopisuje ją do bazy. Jeśli problem nie zostanie naprawiony z routera będą wciąż płynąć informacje o tej trasie. Nie ma sensu ich zatem dodawać po raz kolejny do bazy dopóki rout_naprawione nie zmieni wartości na '1' (a rout_naprawione zmieni się na '1' w momencie kiedy z tego routera przyjdzie pusta informacja - znaczy brak problemów) . Tyle o programie... Teraz pytanie: "Jak dodać do bazy tylko takie rekordy, których jeszcze nie ma"? Przykładowo w bazie są dwie warotści: (1, 0, 0, '01cwleszka.bp', '195.116.20.124 via 83.16.209.217 dev eth1', 1264118220), (2, 0, 1, '01cwleszka.bp', '87.204.0.82 via 83.16.209.217 dev eth1', 1264118220), Jeden rekord ma flagę naprawione na 0, a drugi na 1 załóżmy że do skryptu przychodzi teraz komunikat o błędzie: '01cwleszka.bp', '195.116.20.124 via 83.16.209.217 dev eth1' '02cwleszka.bp', 'default via 83.16.209.217 dev eth1' Chciałbym dodać do bazy tylko drugi komunikat (pierwszy już jest i ma status 'naprawione' na '0', więc nie potrzebujemy go dodawać). Bawiłem się z WHERE NOT EXIST, ale ciągle dostaję błąd składni. Mam nadzieję że jasno wyjaśniłem o co mi chodzi:) Ten post edytował lorak110786 3.02.2010, 21:46:55 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Można trigger BEFORE INSERT który sprawdzi czy już jest taki rekord.
Można założyć UNIQUE KEY na (rout_naprawione,rout_komunikat) i wstawiać przez INSERT ... ON DUPLIKATE KEY UPDATE rout_id = rout_id |
|
|
![]()
Post
#3
|
|
Grupa: Nieautoryzowani Postów: 34 Pomógł: 1 Dołączył: 22.06.2009 Skąd: Koszalin/Poznań Ostrzeżenie: (0%) ![]() ![]() |
Chciałem uniknąć UNIQUE KEY bo tak naprawdę może się zdarzyć kilka takich przypadków że (rout_naprawione,rout_komunikat) będą się powtarzały. Np po naprawieniu złej trasy, na drugi dzień znów wystąpi ten sam problem, i znów zostanie naprawiony. Wtedy nie będzie można oznaczyć kolejnego rekordu jako naprawiony bo rout_naprawione=1,rout_komunikat='jakaś wartość' już będzie istniał. Chyba że UNIQUE KEY działa jakoś inaczej.
Czy mógłbyś powiedzieć coś więcej nt. BEFORE INSERT? Czy można w ten sposób sprawdzić i oznaczyć kilka rekordów? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
http://dev.mysql.com/doc/refman/5.0/en/triggers.html
W triggerze robisz zapytanie do tabeli do której chcesz wstawiać, żeby sprawdzić czy rekord o zadanych wartościach już istnieje. Jeśli tak, to musisz wywołać jakiś błąd żeby przerwać wstawianie (przynajmniej dla MySQL < 5.5). Ja mam w bazie tabelę w której mam teksty typu 'Taki wiersz już istnieje' z kluczem UNIQUE. Żeby przerwać triggera wstawiam do niej np tekst 'Taki wiersz już istnieje'. Do aplikacji leci wtedy błąd nr 1062, który można złapać i z komunikatu błądu wyciągnąć co się stało. Całkiem dobrze to działa jak wstawia się pojedyńcze wiersze. Przy wstawianiu kilku na raz może nie być tak miło... jeden błędny wiersz przerwie pewnie wykonanie całego inserta. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 7.06.2025 - 10:44 |