Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Wstawianie do bazy gdy jeszcze nie ma takiego rekoru
Forum PHP.pl > Forum > Bazy danych > MySQL
lorak110786
Mam dość skomplikowany problem:)

Otóż mam tabelę 'router'
  1. CREATE TABLE IF NOT EXISTS `router` (
  2. `rout_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `rout_aktywne` int(11) NOT NULL,
  4. `rout_naprawione` int(11) NOT NULL,
  5. `rout_host` varchar(20) NOT NULL,
  6. `rout_komunikat` varchar(60) NOT NULL,
  7. `rout_time` int(11) NOT NULL,
  8. UNIQUE KEY `rout_id` (`rout_id`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=12 ;

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:)
Mchl
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
lorak110786
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?
Mchl
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.