Chcę dodać wiersz do tabeli bazy danych, ale jeśli istnieje wiersz z tym samym unikalnym kluczem, chcę go zaktualizować.
Na przykład:
insert into table (id, name, age) values(1, "A", 19)
Powiedzmy, że unikalny klucz to id
, aw mojej bazie danych jest wiersz z id = 1
. W takim przypadku chcę zaktualizować ten wiersz o te wartości. Zwykle daje to błąd.
Jeśli insert IGNORE
go użyję, zignoruje błąd, ale nadal się nie aktualizuje.
mysql
sql
insert-update
upsert
Keshan
źródło
źródło
Odpowiedzi:
Posługiwać się
INSERT ... ON DUPLICATE KEY UPDATE
PYTANIE:
źródło
affected row count
wyniki2
przy udanej aktualizacji (na duplikacie klucza) pojedynczego wiersza? Czy ktoś jeszcze miał taki wynik? (Dane są aktualizowane poprawnie: co oznacza, że aktualizowany jest tylko 1 wiersz)ON DUPLICATE KEY UPDATE
zwiększają dotknięte wiersze o 2. Zgłasza 0, jeśli nic nie jest faktycznie aktualizowane (tak jak zwykłeUPDATE
).Sprawdź WYMIANA
http://dev.mysql.com/doc/refman/5.0/en/replace.html
źródło
Podczas korzystania z wstawiania wsadowego użyj następującej składni:
źródło
VALUES(name)
to nie pomoże, możesz spróbowaćname = 'name_value',...;
Wypróbuj to:
Mam nadzieję że to pomoże.
źródło
Spróbuj tego:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
Uwaga:
Jeśli id jest kluczem podstawowym, to po pierwszym wstawieniu za
id='1'
każdym razem, gdy próba wstawieniaid='1'
zaktualizuje imię i wiek, a poprzednie imię i nazwisko zmienią się.źródło
Wszystkie te rozwiązania będą działać w odniesieniu do twojego pytania.
Jeśli chcesz poznać szczegóły dotyczące tego oświadczenia, odwiedź ten link
źródło
REPLACE
nie jest udokumentowany w połączonym dokumencie.Podczas korzystania z SQLite:
Pod warunkiem, że
id
jest to klucz podstawowy. Albo po prostu wstawia kolejny wiersz. Zobacz INSERT (SQLite).źródło
replace into
to jest dokładnie „wstawić lub zaktualizować, gdy istnieje”. @OwlCREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
Tylko dlatego, że szukałem tego rozwiązania, ale do aktualizacji z innej tabeli o identycznej strukturze (w moim przypadku strona testuje DB na DB):
Jak wspomniano w innym miejscu, należy uwzględnić tylko kolumny, które chcesz zaktualizować
ON DUPLICATE KEY UPDATE
.Nie trzeba wymieniać kolumn w
INSERT
lubSELECT
, choć zgadzam się, że to prawdopodobnie lepsza praktyka.źródło
Jeśli chcesz utworzyć
non-primary
pola jako kryteria / warunkiON DUPLICATE
, możesz utworzyćUNIQUE INDEX
klucz w tej tabeli, aby je uruchomićDUPLICATE
.A jeśli chcesz połączyć dwa pola, aby uczynić go unikalnym w tabeli, możesz to osiągnąć, dodając więcej do ostatniego parametru.
Uwaga: pamiętaj, aby najpierw usunąć wszystkie dane, które mają takie same
name
iage
wartości w innych wierszach.Następnie powinno uruchomić
ON DUPLICATE
zdarzenie.źródło
W moim przypadku utworzyłem poniższe zapytania, ale w pierwszym zapytaniu, jeśli
id
1 już istnieje, a wiek już tam jest, po tym, jeśli utworzysz pierwsze zapytanie bez,age
wówczas wartość nieage
będzie równaw celu uniknięcia powyższego problemu utwórz zapytanie jak poniżej
niech ci to pomoże ...
źródło
W przypadku, gdy chcesz zachować stare pole (np. Nazwa). Zapytanie będzie:
źródło