Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana, lub dodanie
Forum PHP.pl > Forum > Bazy danych > MySQL
CPoDe
Czy istnieje jakiś szybki sposób na zmianę jakiegoś rekordu jeżeli istnieje lub jego dodanie w innym przypadku? Aktualnie wykonuje to przy pomocy PHP, przez sprawdzanie czy wiersz istnieje.
W internecie dopatrzyłem się dwóch metod wykonywania tego działąnia po stronie SQL: REPLACE oraz ON DUPLICATE KEY.

Natomiast nie bardzo orientuję się na czym polega różnica oraz która z nich jest szybsza.
Wyczytałem również iż trzeba w nich stosować "unique" i nie bardzo wiem jak to zastosować dla kilku kolumn, tak aby podczas sprawdzania unikalności były brane trzy kolumny.

Dla przykładu:

Kolumna 1: ABCCBA
Kolumna 2: 121212

Gdyby brać pod uwagę unikalność jednej z tych kolumn, to powstałby problem. W przypadku wzięcia pod uwagę całości(dwóch kolumn rekordu), wszystko staje się unikalne.

Z góry dziękuję.
b4rt3kk
Najlepszym sposobem jest zastosowanie triggera ON INSERT OR UPDATE dla tabeli dla której robisz INSERT.
mmmmmmm
REPLACE robi DELETE rekordu, który spełnia reguły unikalności, a następnie dodaje go z nowymi wartościami.
Jak działa ON DUPLICATE KEY to nie wiem (nie lubię MySQL-owych wynalzaków), ale domyślam się, że możesz tam trochę więcej zdefiniować. Na twoim miejscu użyłbym REPLACE i po kłopocie.
Sephirus
Pierwsze co musisz zrobić to dodać index UNIQUE na tych trzech kolumnach o których mówisz. Index na kilku kolumnach oznacza, że nie może powstać drugi rekord z z tą samą kombinacją wartości w polach z indeksu.

przykład:

rekord istniejący: A B C
rekord dodawany: A B C (nie doda się bo ta kombinacja już jest)
rekord dodawany: A B D (doda się bo tej kombinacji nie ma mimo że A i B się powtarza)

Jeżeli twoje rekordy posiadają jakieś ogólne ID na auto increment to odradzam użycie REPLACE - poniewasz usuwa on rekord i dodaje na nowo. Przykład:

rekord istniejący: 123 A B C XXX
(123 to ID rekordu)
powiedzmy że chcesz dla kombinacji A-B-C zmienić XXX na YYY. Jeśli zrobisz to replacem uzyskasz przykładowo:

345 A B C YYY

rekord nie jest już pod ID 123 a pod jakimś kolejnym wolnym - tu przykładowo 345 - w niektórych przypadkach to może coś popsuć.

Polecam zatem rozwiązanie jakim jest ON DUPLICATE KEY UPDATE.

Działa to tak, że robisz zwykłego inserta, dodając na końcu opcje co ma się zmienić jeśli rekord taki istnieje (natrafia na jakiś konflikt kluczy):

  1. INSERT INTO tabelka (pole1,pole2,pole3,pole4) VALUES ('A','B','C','YYY') ON DUPLICATE KEY UPDATE pole4 = 'YYY';


I to zadziała tak, że INSERT się nie powiedzie (klucze unikalne) i zostanie wykonany UPDATE ustawiające pole4 na 'YYY'.

Możesz użyć składni alternatywnej:

  1. INSERT INTO tabelka (pole1,pole2,pole3,pole4) VALUES ('A','B','C','YYY') ON DUPLICATE KEY UPDATE pole4 = VALUES(pole4);

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.