Witam, mam taki problem bo piszę sobie skrypt i chcę zrobić coś takiego, sprawdzić czy istnieje rekord o imieniu Agnieszka i jeśli istnieje to zwiększyć ilość wystąpień, jeśli nie to wstawić rekord z imieniem Agnieszka. Czy możliwe jest to z poziomu samego SQL'a? Lub czy istnieje jakiś fajny sposób żeby to zrobić w jednym zapytaniu?
kaziuVBC napisał(a)
sprawdzić czy istnieje rekord o imieniu Agnieszka i jeśli istnieje to zwiększyć ilość wystąpień, jeśli nie to wstawić rekord z imieniem Agnieszka.
czytam to i czytam i nie rozumiem [!!!]
chodzi mi o to że jeśli istnieje rekord w którym imię = Agnieszka, wtedy zwiększ ilość wystąpień, w przeciwnym wypadku dodaj rekord z tym imieniem.
Musisz w czasie wstawiania rekordu zablokować całą tabelę bo inaczej w tym samym czasie ktoś inny może wstawić jednocześnie. Chyba nie ma innego wyjścia jak zrobić jednoczesne update lock_table set lock=lock i jeśli ktoś inny wstawi jednocześnie to transakcje zajdą na siebie dzięki temu sztucznemu update wyśietlając wyjątek "update conflict on concurrent update". Nie bardzo mi się podoba blokowanie całej tabeli która w niektórych wypadkach może być ogromniasta. Raczej zrobiłbym indeks unikalny na polu imię i w razie powtórnego wstawienia tego samego imienia pojawi się wyjątek bazy danych "key violation". Inna możliwość to dopuszczać powtarzanie imion i w razie potrzeby można policzyć powtórzenia poprzez grupowanie instrukcją SQL.
MySQL:
Robisz sobie tabelke "imiona", z dwiema kolumnami Imie, ilosc
Imie to klucz glowny, a ilosc ma default =1
I teraz myk polega na zapytaniu:
INSERT INTO `imiona`(`Imie`) VALUES ('Agnieszka')
ON DUPLICATE KEY UPDATE ilosc=ilosc+1
chodzi mi o samo zapytanie, o żadne blokowanie tabel , tylko i wyłącznie zapytanie, jeśli oczywiście jest możliwośc wykonania takiego zapytania
@abc: dokładnie o coś takiego mi chodziło ;-) tylko że to działa jeśli imię jest kluczem głównym. a jeśli kluczem głównym jest id które musi się samo incrementować, co wtedy?
kaziuVBC napisał(a)
@abc: dokładnie o coś takiego mi chodziło ;-) tylko że to działa jeśli imię jest kluczem głównym. a jeśli kluczem głównym jest id które musi się samo incrementować, co wtedy?
A czemu ma nie działac jeśli zrobisz dodatkowy indeks unique na polu z imieniem?
kaziuVBC napisał(a)
@abc: dokładnie o coś takiego mi chodziło ;-) tylko że to działa jeśli imię jest kluczem głównym. a jeśli kluczem głównym jest id które musi się samo incrementować, co wtedy?
To moze Imie bedzie Unique i tez zadziala - ale musisz sprawdzic
na razie nie mam pola id, także działa aż miło ale przetestuje z uniqe i zobaczymy. dzięki wielkie za pomoc ;-)