Szukałem w okolicy, ale nie znalazłem, czy to możliwe.
Mam takie zapytanie MySQL:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
Identyfikator pola ma „unikalny indeks”, więc nie może być ich dwóch. Teraz, jeśli ten sam identyfikator jest już obecny w bazie danych, chciałbym go zaktualizować. Ale czy naprawdę muszę ponownie określić wszystkie te pola, na przykład:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8
Lub:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g)
Podałem wszystko już we wkładce ...
Dodatkowa uwaga, chciałbym skorzystać z obejścia, aby uzyskać identyfikator!
id=LAST_INSERT_ID(id)
Mam nadzieję, że ktoś może mi powiedzieć, jaki jest najbardziej skuteczny sposób.
a=VALUES(a), b=VALUES(b), ...
jest drogą, którą musisz iść. Tak to robię dla wszystkich moichINSERT ON DUPLICATE KEY UPDATE
wypowiedzi.Odpowiedzi:
UPDATE
Oświadczenie podane tak, że starsze pola mogą zostać zaktualizowane do nowej wartości. Jeśli Twoje starsze wartości są takie same, jak nowe, po co w ogóle miałbyś je aktualizować?Np. jeśli kolumny
a
dog
już ustawiony2
do8
; nie byłoby potrzeby ponownej aktualizacji.Alternatywnie możesz użyć:
Aby uzyskać
id
odLAST_INSERT_ID
; musisz określić aplikację zaplecza, której używasz do tego samego.W przypadku LuaSQL a
conn:getlastautoid()
pobiera wartość.źródło
tbl
ma już wiersz (1,10), to:INSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=VALUES(a)
ustawi a = 2 . Podczas gdyINSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=a
ustawi a = 10a=a
nic nie aktualizuje. (Zapytania w pierwotnym pytaniu również niczego nie aktualizują, ale wydaje się, że aktualizacja jest tym, co zamierzał OP.)Istnieje rozszerzenie SQL specyficzne dla MySQL, które może być tym, czego chcesz -
REPLACE INTO
Jednak nie działa to tak samo, jak „PRZY DUPLIKOWANEJ AKTUALIZACJI”
Usuwa stary wiersz, który koliduje z nowym wierszem, a następnie wstawia nowy wiersz. Dopóki nie masz klucza podstawowego w tabeli, byłoby dobrze, ale jeśli tak, to jeśli jakakolwiek inna tabela odwołuje się do tego klucza podstawowego
Nie możesz odwoływać się do wartości w starych wierszach, więc nie możesz zrobić odpowiednika
To powinno działać - last_insert_id () powinno mieć poprawną wartość, o ile klucz podstawowy jest automatycznie zwiększany.
Jednak, jak powiedziałem, jeśli faktycznie używasz tego klucza podstawowego w innych tabelach,
REPLACE INTO
prawdopodobnie nie będzie to dla ciebie akceptowalne, ponieważ usuwa stary wiersz, który zderzył się za pomocą unikalnego klucza.Ktoś inny zasugerował, zanim będziesz mógł ograniczyć pisanie, wykonując:
źródło
replace into
zapytaniem?Nie ma innego wyjścia, wszystko muszę określić dwukrotnie. Pierwsza w przypadku wkładki, druga w przypadku aktualizacji.
źródło
Oto rozwiązanie Twojego problemu:
Próbowałem rozwiązać problem taki jak twój i chcę zasugerować przetestowanie od prostego aspektu.
Wykonaj następujące kroki: Ucz się z prostego rozwiązania.
Krok 1: Utwórz schemat tabeli za pomocą tego zapytania SQL:
Krok 2: Utwórz indeks dwóch kolumn, aby zapobiec powielaniu danych, używając następującego zapytania SQL:
lub Utwórz indeks dwóch kolumn z GUI w następujący sposób:
Krok 3: Zaktualizuj, jeśli istnieje, wstaw, jeśli nie używasz następujących zapytań:
źródło
Na wypadek, gdybyś był w stanie wykorzystać język skryptowy do przygotowania zapytań SQL, możesz ponownie użyć par pole = wartość, używając
SET
zamiast(a,b,c) VALUES(a,b,c)
.Przykład z PHP:
Przykładowa tabela:
źródło
Można rozważyć użycie
REPLACE INTO
składni, ale ostrzegam, po duplikat klucza podstawowego / wyjątkowy, to usuwa wiersz i WKŁADKI nowy.Nie musisz ponownie określać wszystkich pól. Należy jednak wziąć pod uwagę możliwe zmniejszenie wydajności (w zależności od projektu tabeli).
Ostrzeżenia:
źródło
Wiem, że jest późno, ale mam nadzieję, że komuś pomoże ta odpowiedź
Możesz przeczytać samouczek poniżej:
źródło
new
:INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new ON DUPLICATE KEY UPDATE c = new.a+new.b;
możesz użyć wstawiania ignorowania w takim przypadku, zignoruje, jeśli otrzyma zduplikowane rekordy INSERT IGNORE ...; - bez NA DUPLIKATU KLUCZA
źródło