Forum Gry Hobby Sprzęt Rozmawiamy Archiwum Regulamin

Forum: MySQL - pomocy przy krótkiej procedurce...

27.03.2012 11:06
legrooch
1
legrooch
240
MPO Squad Member

MySQL - pomocy przy krótkiej procedurce...

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ś?

27.03.2012 11:16
maviozo
2
odpowiedz
maviozo
239
autor zdjęć

INSERT .... ON DUPLICATE KEY UPDATE

27.03.2012 12:14
legrooch
3
odpowiedz
legrooch
240
MPO Squad Member

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'

27.03.2012 12:36
4
odpowiedz
ElNinho
159
STROH 80

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));

27.03.2012 14:02
legrooch
5
odpowiedz
legrooch
240
MPO Squad Member

Nie mogę naruszyć tego, co jest już zrobione w uzytkownicy_test

27.03.2012 17:30
6
odpowiedz
ElNinho
159
STROH 80

no to nie bardzo rozumiem ... chcesz ją updatować a nie możesz naruszyć ?

27.03.2012 18:51
legrooch
7
odpowiedz
legrooch
240
MPO Squad Member

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 :)

27.03.2012 19:52
8
odpowiedz
ElNinho
159
STROH 80

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

Forum: MySQL - pomocy przy krótkiej procedurce...