Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Wstawianie do bazy gdy jeszcze nie ma takiego rekoru
lorak110786
post 3.02.2010, 21:44:54
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'
  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:)

Ten post edytował lorak110786 3.02.2010, 21:46:55
Go to the top of the page
+Quote Post
Mchl
post 3.02.2010, 22:34:14
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
Go to the top of the page
+Quote Post
lorak110786
post 3.02.2010, 23:46:19
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?
Go to the top of the page
+Quote Post
Mchl
post 4.02.2010, 07:59:10
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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 7.06.2025 - 10:44