Mam tabelę z unikalnym kluczem dla dwóch kolumn:
CREATE TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );
Chcę wstawić wiersz do tej tabeli, ale jeśli klucz istnieje, nie rób nic! Nie chcę generować błędu, ponieważ klucze istnieją.
Wiem, że istnieje następująca składnia:
INSERT ... ON DUPLICATE KEY UPDATE ...
ale czy jest coś takiego:
INSERT ... ON DUPLICATE KEY DO NOTHING
?
mysql
sql
unique-key
ufk
źródło
źródło
INSERT IGNORE
bezON DUPLICATE KEY
części, np.INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
JAK WDROŻYĆ „wstaw, jeśli nie istnieje”?
1.
REPLACE INTO
plusy:
Cons:
za wolno.
klawisz auto-inkrementacji ZMIENI (zwiększy się o 1), jeśli są pasujące wpisy
unique key
lubprimary key
, ponieważ usuwa stary wpis, a następnie wstawia nowy.2)
INSERT IGNORE
plusy:
Cons:
klucz automatycznej inkrementacji nie zmieni się, jeśli będą pasujące wpisy,
unique key
lubprimary key
indeks indeksu automatycznej inkrementacji wzrośnie o 1niektóre inne błędy / ostrzeżenia będą ignorowane, takie jak błąd konwersji danych.
3)
INSERT ... ON DUPLICATE KEY UPDATE
plusy:
Cons:
wygląda stosunkowo skomplikowanie, jeśli chcesz wstawić nie aktualizować.
klucz automatycznej inkrementacji nie zmieni się, jeśli będą pasujące wpisy,
unique key
lubprimary key
indeks indeksu automatycznej inkrementacji wzrośnie o 14. Jakikolwiek sposób, aby zatrzymać zwiększanie klucza automatycznego przyrostu, jeśli istnieją dopasowania wejściowe
unique key
lubprimary key
?Jak wspomniano w komentarzu poniżej przez @toien: „kolumna automatycznego przyrostu będzie zależała od
innodb_autoinc_lock_mode
konfiguracji po wersji 5.1”, jeśli używaszinnodb
jako silnika, ale ma to również wpływ na współbieżność, więc należy ją dobrze rozważyć przed użyciem. Jak dotąd nie widzę lepszego rozwiązania.źródło
innodb_autoinc_lock_mode
konfiguracji po wersji 5.1Użyj
ON DUPLICATE KEY UPDATE ...
,Negatywny: ponieważ
UPDATE
wykorzystuje zasoby do drugiego działania.Użyj
INSERT IGNORE ...
,Negatywne: MySQL nie wyświetli żadnych błędów, jeśli coś pójdzie nie tak, więc nie możesz sobie z nimi poradzić. Używaj go tylko wtedy, gdy nie zależy ci na zapytaniu.
źródło