ON DUPLICATE KEY - pominięcie jeżeli równy -1

0

Witam.
Mam myślę dość poważny problem, z którym nie potrafię sobie poradzić.
Dodaję do bazy zapytanie:

INSERT INTO `wszystkie_aukcje` (`id`,`tytul`,`cena`, `status`) 
VALUES  ('32324', 'Tytuł ', '50', '1'), ('535', 'Tytuł 2 ', '100', '-1'), ('1111', 'Tytuł 3', '150', '1')
ON DUPLICATE KEY UPDATE cena=values(cena),status=values(status)

Wszystkie powyższe rekordy istnieją w bazie więc powinny zostać zaktualizowane. Chciałbym zaktualizować wszystkie ceny jednak nie chcę aktualizować statusów o wartości -1. Próbowałem pobawić się z case lub if jednak zawsze jakaś wartość musi zostać przekazana. Czy jest szansa na rozwiązanie tego problemu? W powyższym przykładzie aktualizowanych jest ponad 100 rekordów w jednym zapytaniu.

Usunięcie z zapytania status=values(status) spowoduje, że wszystkie trzy rekordy nie zaktualizują statusu. Pozostawienie ,status=values(status) w zapytaniu spowoduje, że zaktualizują się wszystkie, wraz ze statusem -1, którego nie chcę ruszać

2

Czemu nie użyjesz UPDATE jeśli chcesz zrobić aktualizację?

screenshot-20210127180555.png
Zdecyduj się...

2

Serio? Fajnie, że dajesz tagi ale jaki to ma zwiazek z MSSQL?

co do pytania:

INSERT INTO `wszystkie_aukcje` (`id`,`tytul`,`cena`, `status`) 
VALUES  ('32324', 'Tytuł ', '50', '1'), ('535', 'Tytuł 2 ', '100', '-1'), ('1111', 'Tytuł 3', '150', '1')
ON DUPLICATE KEY UPDATE cena=values(cena),status=case when status = -1 then status else values(status) end
0

@hipekk: UPDATE nie wstawi nowego rekordu jeżeli ten nie istnieje. INSERT go nie zaktualizuje jeżeli istnieje.

Panczo napisał(a):

co do pytania:

INSERT INTO `wszystkie_aukcje` (`id`,`tytul`,`cena`, `status`) 
VALUES  ('32324', 'Tytuł ', '50', '1'), ('535', 'Tytuł 2 ', '100', '-1'), ('1111', 'Tytuł 3', '150', '1')
ON DUPLICATE KEY UPDATE cena=values(cena),status=case when status = -1 then status else values(status) end

Dzięki za pokazanie składni jak to ma wyglądać, niestety to nie działa. Aktualizuje także -1, próbowałem na różne sposoby zmodyfikować zapytanie łącznie ze status < 0.
Na pierwszy rzut oka wydaje się to oczywiste jednak nie działa i modyfikuje komórkę do -1 zamiast ją pominąć.

PS: tagi wleciały automatycznie, nie mogę już edytować posta

0

jaki typ kolumny ma status?

0
Legalnl napisał(a):

@hipekk: UPDATE nie wstawi nowego rekordu jeżeli ten nie istnieje. INSERT go nie zaktualizuje jeżeli istnieje.

To oczywiste, ale na wstępie zaznaczyłeś, że:

Wszystkie powyższe rekordy istnieją w bazie więc powinny zostać zaktualizowane. Chciałbym zaktualizować wszystkie ceny jednak nie chcę aktualizować statusów o wartości -1.

Nie jestem pewny co chcesz zrobić...
Napisałeś:

Aktualizuje także -1

a po chwili:

Na pierwszy rzut oka wydaje się to oczywiste jednak nie działa i modyfikuje komórkę do -1 zamiast ją pominąć.

Czyli ma pomiąć rekordy istniejące w tabeli które mają status = -1 czy te części zapytania które mają status = -1?

0

Typ kolumny Integer.

W zapytaniu jest więcej zmiennych, chciałbym aktualizować wszystkie rekordy. Jedyne co chce pominąć to aktualizacje status -1 jednak chcę aktualizować inne zmienne w danym rekordzie. W skrócie: Aktualizować wszystkie komórki oprócz komórki status jeżeli jej wartość wynosi -1

Sprawę rozwiązałem póki co tak, że tworze dwa zapytania, jedne z rekordami o status != 1 oraz drugie ze statusem =-1 bez status=values(status) w zapytaniu. Można też osobno aktualizować tylko statusy pomijając te, które mają -1.

Pytanie jednak, czy da się to zrobić w jednym zapytaniu :)

0

Da się dokładnie tak jak pokazał @Panczo.

Może pokaż zapytanie tworzące tabelę i jakieś przykładowe dane.

0

Po części macie racje. Sprawdziłem jeszcze raz i zapytanie nie aktualizuje statusu jeżeli w bazie wynosi on -1.

Mi chodzi jednak, by nie aktualizował statusu -1 jeżeli takowy pojawi się w zapytaniu a nie jeżeli jest on już zapisany w bazie :)
Prawidłowo więc będzie:

ON DUPLICATE KEY UPDATE cena=values(cena),status=case when values(status) = -1 then status else values(status) end

Dziękuję więc wszystkim, którzy nakierowali mnie na odpowiednie rozwiązanie :) :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1