Witam,
mam tabelę z userami (około 5000), id, imie, nazwisko, numer. Potrzebuję zrobić aktualizację innej tablicy opierając się o kolumnę numer.
Jeżeli numer się pojawia, robię aktualizację rekordu o imie i nazwisko (mogą się zmieniać u użytkowników), jeżeli numeru nie ma, robię insert.
Pomoże ktoś?
Hmm... nie wiem czy dobrze zrozumiałem z dokumentacji, ale to działa po duplikacie klucza, na który where nie ma wpływu.
A przynajmniej w wersji testowej nie chce mi to dzialać.
INSERT INTO uzytkownicy_test (nazwisko, imie, numer)
SELECT nazwisko, imie, numer FROM uzytkownicy WHERE numer='123456' ON DUPLICATE KEY
UPDATE numer = numer + '7'
to ma być jedną instrukcją zrobione ?
MERGE INTO
tabela_dest td
USING
tabela_source ts
ON td.numer = ts.numer
when matched then UPDATE set td.imie = ts.imie, td.nazwisko = ts.nazwisko
when not matched then INSERT (tu kolumny tabeli docelowej, np imie, nazwisko, numer) value (ts.imie, ts.nazwisko, ts.numer);
aczkolwiek pewnie na mysql nie zadziała :)
można też oblecieć pętlą:
for i in (select * from tabela_source) loop
update tabela_dest set imie = i.imie, nazwisko = i.nazwisko where numer = i.numer;
if sql%rowcount = 0 then
insert into tabela_dest (imie, nazwisko, numer) values (i.imie, i.nazwisko, i.numer);
end if;
end loop;
w ostateczności:
update tabela_dest td set (imie, nazwisko) = (select imie, nazwisko from tabela_source ts where td.numer = ts.numer);
insert into tabela_dest (imie, nazwisko, numer) (select imie, nazwisko, numer from tabela_source where numer not in (select numer from tabela_dest));
no to nie bardzo rozumiem ... chcesz ją updatować a nie możesz naruszyć ?
Dobra, wiesz że tłumaczenie u mnie do najlżejszych nie należy :/
Zrobiłem backup tabeli, wywaliłem te, co chciałem pominąć, dodałem nowe i zaktualizowałem stare. Po kolei, bez procedury :)
a tak z innej beczki to ten ON DUPLICATE podany przez Ciebie powinien zadziałać, jeśli numer jest kluczem
tylko w klauzuli UPDATE wtedy nie podajesz numer a nazwisko, imię itp