Generator SQL MERGE
Upsert z listy wierszy dla PostgreSQL, MySQL, MariaDB, SQLite, SQL Server i Oracle: ON CONFLICT, ON DUPLICATE KEY lub MERGE
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Opcjonalnie ze schematem.
Po przecinku. Każda musi być też na liście kolumn.
Po przecinku, bez cudzysłowów.
Gotowe literały SQL: teksty w apostrofach, liczby bez. Wiersz możesz wkleić też w nawiasach.
Wiersze
Kolumny
Do nadpisania
Linie SQL
SQL: PostgreSQL (ON CONFLICT)
Wymaga unikalnego indeksu lub klucza głównego na kolumnach klucza (PostgreSQL 9.5 i nowsze).
Ściąga: UPSERT w popularnych bazach
| Baza | Składnia | Wersja | Konflikt wykrywa |
|---|---|---|---|
| PostgreSQL | INSERT … ON CONFLICT … DO UPDATE | 9.5+ | kolumny z ON CONFLICT (wymagany unikalny indeks) |
| PostgreSQL | MERGE | 15+ | warunek ON (dowolne kolumny) |
| MySQL / MariaDB | INSERT … ON DUPLICATE KEY UPDATE | VALUES(): także MariaDB | dowolny unikalny indeks lub klucz główny |
| MySQL | ON DUPLICATE KEY UPDATE z aliasem wiersza | 8.0.19+ (bez MariaDB) | dowolny unikalny indeks lub klucz główny |
| SQLite | INSERT … ON CONFLICT … DO UPDATE | 3.24.0+ | kolumny z ON CONFLICT (wymagany unikalny indeks) |
| SQL Server | MERGE | 2008+ | warunek ON (dowolne kolumny) |
| Oracle | MERGE | 9i+ | warunek ON (bez aktualizacji kolumn z ON) |
Jak powstaje polecenie
Dla tabeli users kolumny klucza (id) wskazują istniejący rekord, a pozostałe kolumny są nadpisywane wartościami z nowego wiersza. Teraz: wierszy 2, kolumn do nadpisania 3. Rekord, którego klucza nie ma w tabeli, zostanie dodany. Wiersze spoza listy zostają bez zmian.
Jak wpisać wartości
Jeden wiersz w linii, w kolejności kolumn. Liczby wpisz bez cudzysłowu, teksty w apostrofach ('Anna'), a apostrof w tekście podwój ('O''Brien'). Funkcje, np. CURRENT_TIMESTAMP, zostają bez zmian. Brak wartości to NULL. Generator nie zmienia wartości i nie zapisuje Twoich danych.
Typowe pułapki
Kolumny klucza powinny mieć unikalny indeks lub klucz główny. Ten sam klucz dwa razy w jednym poleceniu zwykle kończy się błędem. Funkcje daty różnią się między bazami (NOW() nie ma w SQL Server, SQLite i Oracle). Polecenie nie usuwa wierszy, których nie ma na liście. Pierwszy test zrób na kopii danych.
ON CONFLICT czy MERGE
Zapis ON CONFLICT i ON DUPLICATE KEY jest krótszy i wystarcza do prostego upsertu. MERGE to składnia standardu SQL, wymagana w SQL Server i Oracle, a w PostgreSQL dostępna od wersji 15. Przy równoległych zapisach sprawdź zalecenia dla swojej bazy.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator SQL MERGE / UPSERT
Upsert wstawia nowy wiersz albo aktualizuje istniejący – w jednej instrukcji. Każda baza ma inną składnię, więc generator SQL MERGE dopasowuje dialekt: PostgreSQL (ON CONFLICT albo MERGE od wersji 15), MySQL i MariaDB (z VALUES() albo z aliasem wiersza), SQLite, SQL Server i Oracle.
Składnia upsertu w poszczególnych bazach
| Dialekt | Mechanizm | Odwołanie do nowej wartości |
|---|---|---|
| PostgreSQL 9.5+ | INSERT ... ON CONFLICT (klucz) DO UPDATE | EXCLUDED.kolumna |
| PostgreSQL 15+ | MERGE INTO ... USING (VALUES ...) | source.kolumna |
| MySQL / MariaDB | INSERT ... ON DUPLICATE KEY UPDATE | VALUES(kolumna) |
| MySQL 8.0.19+ | INSERT ... AS new ON DUPLICATE KEY UPDATE | new.kolumna |
| SQLite 3.24+ | INSERT ... ON CONFLICT (klucz) DO UPDATE | excluded.kolumna |
| SQL Server 2008+ | MERGE INTO ... USING (VALUES ...) | source.kolumna |
| Oracle 9i+ | MERGE INTO ... USING (SELECT ... FROM dual UNION ALL ...) | src.kolumna |
Wymagania
- w ON CONFLICT (PostgreSQL, SQLite) kolumny konfliktu muszą mieć klucz główny lub unikalny indeks, inaczej baza odrzuci polecenie,
- MySQL i MariaDB ignorują listę kluczy z formularza: konflikt wykrywa każdy unikalny indeks i klucz główny tabeli,
- MERGE (PostgreSQL 15+, SQL Server, Oracle) dopasowuje wiersze warunkiem ON i nie wymaga indeksu, ale bez unikalności jeden wiersz z listy zaktualizuje wszystkie pasujące wiersze tabeli,
- kolumny klucza nie są nadpisywane i każda z nich musi być też na liście wszystkich kolumn,
- w SQL Server MERGE wymaga ostrożności – testuj na kopii.
Jak działa generator SQL MERGE i skąd bierze się wynik
Generator nie łączy się z żadną bazą i nie wykonuje zapytania – buduje wyłącznie tekst instrukcji SQL z danych, które wpiszesz: nazwy tabeli (opcjonalnie ze schematem, np. public.users), listy kolumn klucza, listy wszystkich kolumn oraz wierszy wartości, po jednym w linii. Kolumny klucza trafiają do warunku dopasowania, wszystkie kolumny do części INSERT, a kolumny spoza klucza do listy przypisań w gałęzi aktualizacji. Wynikiem jest jeden gotowy fragment SQL do wklejenia w kliencie bazy, w migracji albo w skrypcie.
Wartości wpisujesz jako gotowe literały SQL: liczby bez cudzysłowu, tekst w apostrofach, apostrof wewnątrz tekstu podwojony ('O''Brien'), brak wartości jako NULL. Generator przepisuje je dosłownie, więc funkcje takie jak NOW() czy CURRENT_TIMESTAMP zostają w poleceniu. Wiersz możesz wkleić też w nawiasach, np. skopiowany z istniejącego INSERT-a. Jedno polecenie mieści do 1000 wierszy.
Przed zbudowaniem SQL narzędzie sprawdza nazwy, liczbę wartości w każdym wierszu, puste komórki i niedomknięte apostrofy, a błąd pokazuje przy konkretnym polu z numerem wiersza. Ostrzega też o powtórzonym kluczu w dwóch wierszach i o NOW() w dialekcie, który tej funkcji nie zna.
Mechanizm upsertu opiera się na unikalności. W wariantach z INSERT baza najpierw próbuje wstawić wiersz. Jeśli wstawienie naruszy klucz główny albo indeks unikalny, silnik nie zwraca błędu, tylko przechodzi do gałęzi aktualizacji i nadpisuje wskazane kolumny wartościami z nieudanego wstawienia. MERGE działa inaczej: łączy listę wartości z tabelą warunkiem ON, dla dopasowanych wierszy wykonuje WHEN MATCHED THEN UPDATE, a dla pozostałych WHEN NOT MATCHED THEN INSERT. Kolumny klucza nie trafiają do listy SET – nadpisanie klucza zmieniłoby warunek dopasowania w trakcie tej samej operacji, a w Oracle aktualizacja kolumny użytej w ON kończy się błędem.
Opcja „Cytuj nazwy tabeli i kolumn” otacza identyfikatory znakami właściwymi dla bazy: odwrotnym apostrofem w MySQL, nawiasami kwadratowymi w SQL Server i podwójnym cudzysłowem w PostgreSQL, SQLite i Oracle. Przy wyborze Oracle opcja wyłącza się sama, bo Oracle zamienia nazwy bez cudzysłowów na wielkie litery, a nazwa users w cudzysłowie to inna tabela niż USERS.
Przykład krok po kroku: aktualizacja cen i stanów produktów
- Wczytaj przykład „Produkty”: tabela products, kolumna klucza sku, kolumny sku, name, price, stock.
- Wiersze wartości:
'SKU-1', 'Laptop', 3999.99, 10oraz'SKU-2', 'Mysz', 99.50, 120. - Kolumna sku musi mieć w tabeli klucz główny lub indeks UNIQUE, bo PostgreSQL wskazuje ją wprost w ON CONFLICT.
- Wybierz dialekt PostgreSQL (ON CONFLICT) i odznacz cytowanie. Wynik ma 7 linii:
INSERT INTO products (sku, name, price, stock) VALUES ('SKU-1', 'Laptop', 3999.99, 10), ('SKU-2', 'Mysz', 99.50, 120) ON CONFLICT (sku) DO UPDATE SET name = EXCLUDED.name, price = EXCLUDED.price, stock = EXCLUDED.stock; - Kafelki nad wynikiem pokazują 2 wiersze, 4 kolumny i 3 kolumny do nadpisania (name, price, stock), bo sku jest kluczem.
- W tabeli istnieje już SKU-1 z price = 4299.00 i stock = 4, a SKU-2 nie ma. Dla SKU-1 wykonuje się gałąź UPDATE: price = 3999.99, stock = 10. SKU-2 zostaje dodany jako nowy wiersz.
- Stan magazynu został nadpisany, nie zsumowany: SKU-1 ma 10 sztuk, a nie 4 + 10 = 14. Jeśli chcesz dodawać dostawy, zmień w skopiowanym poleceniu jedną linię na
stock = products.stock + EXCLUDED.stock. Gałąź UPDATE wykonuje się tylko dla istniejących wierszy, więc nowy SKU-2 i tak dostanie 120.
Po przełączeniu na SQL Server te same dane trafiają do MERGE INTO products AS target USING (VALUES ...) AS source (sku, name, price, stock) ON (target.sku = source.sku), a przypisania mają postać target.price = source.price. Średnik na końcu MERGE jest w SQL Server obowiązkowy.
Praktyczne wskazówki przy generowaniu upsertu
- Klucz złożony wpisz po przecinku, np. date, channel (przykład „Statystyki”). W ON CONFLICT musi mu odpowiadać indeks unikalny na dokładnie tych kolumnach, a w MERGE powstaje warunek ON z AND. Indeks przygotujesz w generatorze indeksu SQL.
- Usuń powtórzone klucze z listy. MySQL i SQLite przetworzą takie wiersze po kolei i zostanie wartość z ostatniego, ale PostgreSQL, SQL Server i Oracle zwykle przerwą polecenie błędem, bo ten sam wiersz tabeli byłby zmieniany dwa razy.
- Dopasuj funkcje daty do bazy. NOW() działa w PostgreSQL i MySQL, a w SQL Server, SQLite i Oracle użyj CURRENT_TIMESTAMP.
- Gdy wszystkie kolumny należą do klucza, nie ma czego aktualizować. PostgreSQL i SQLite dostaną wtedy ON CONFLICT DO NOTHING, MySQL pustą operację id = id, a MERGE tylko gałąź WHEN NOT MATCHED. Brakujące wiersze zostaną dodane, istniejące zostają bez zmian.
- Wariant MySQL wybierz według wersji serwera. VALUES() w ON DUPLICATE KEY UPDATE jest od MySQL 8.0.20 oznaczone jako przestarzałe; alias wiersza (AS new) działa od 8.0.19, ale MariaDB go nie obsługuje.
- Przy SQL Server testuj na kopii, a przy równoległych zapisach rozważ podpowiedź WITH (HOLDLOCK).
- Powyżej 1000 wierszy podziel dane na kilka poleceń i obejmij je jedną transakcją.
Czego narzędzie nie robi
- Nie sprawdza schematu. Generator nie wie, czy wskazana kolumna naprawdę ma klucz główny lub indeks unikalny, ani czy typy wartości pasują do kolumn – to weryfikuje dopiero baza.
- Nie generuje operacji DELETE. Pełny MERGE potrafi usuwać wiersze nieobecne w źródle, ale narzędzie tworzy wyłącznie gałęzie wstawienia i aktualizacji. Wiersze spoza listy zostają bez zmian.
- Nie przyjmuje własnych wyrażeń w SET. Każda kolumna spoza klucza jest nadpisywana nową wartością; sumowanie, COALESCE czy warunek WHERE dopisujesz w skopiowanym poleceniu.
- Nie dodaje transakcji ani zwracania danych. Instrukcja wychodzi bez BEGIN, COMMIT i bez RETURNING czy OUTPUT.
Najczęstsze pytania
Czym różni się MERGE od upsert?
MERGE to instrukcja standardu SQL, która łączy tabelę ze źródłem i zależnie od dopasowania wstawia, aktualizuje albo usuwa wiersze. Upsert to węższa operacja wstaw-lub-aktualizuj; w PostgreSQL, SQLite i MySQL zapisuje się ją jako INSERT z klauzulą konfliktu.
Czy MySQL ma MERGE?
Nie. MySQL i MariaDB używają INSERT ... ON DUPLICATE KEY UPDATE, a od MySQL 8.0.19 nowe wartości można adresować aliasem wiersza zamiast funkcji VALUES().
Jak zrobić upsert w PostgreSQL?
Służy do tego INSERT ... ON CONFLICT (kolumny) DO UPDATE SET, a nowe wartości adresuje się przez pseudotabelę EXCLUDED. Wymaga klucza głównego lub indeksu unikalnego na kolumnach konfliktu. Od PostgreSQL 15 dostępny jest też MERGE z warunkiem ON.
Czy SQLite obsługuje ON CONFLICT DO UPDATE?
Tak, od wersji 3.24.0. Starsze wydania SQLite rozpoznają klauzulę ON CONFLICT, ale nie obsługują gałęzi DO UPDATE, więc na takiej bazie instrukcja się nie wykona.
Jak działa MERGE w SQL Server i Oracle?
Tabelę docelową łączy się ze źródłem w klauzuli USING, dopasowanie określa warunek ON, a gałęzie WHEN MATCHED THEN UPDATE oraz WHEN NOT MATCHED THEN INSERT decydują o operacji. Generator buduje źródło dla SQL Server jako listę VALUES, a dla Oracle jako zapytania SELECT ... FROM dual połączone UNION ALL.
Jak aktualizować tylko niektóre kolumny?
Generator nadpisuje wszystkie kolumny spoza klucza. Usuń zbędne przypisania z UPDATE SET w wygenerowanym kodzie albo usuń kolumnę z listy, pamiętając, że wtedy nie trafi też do INSERT.