Przejdź do narzędzia
ViewCSV
Plik nie jest nigdzie wysyłany

Konwertuj CSV do SQL

orders.csv· DANE PRZYKŁADOWE15 wierszy · 8 kolumn
Kolumny kluczowe
Wymagane przy UPSERT, UPDATE i DELETE; przy tworzeniu tabeli służą jako klucz główny.
Typy wartości
BEGIN;
CREATE TABLE IF NOT EXISTS "orders" (
  "order_id" TEXT,
  "customer" TEXT,
  "city" TEXT,
  "product" TEXT,
  "quantity" TEXT,
  "unit_price" TEXT,
  "order_date" TEXT,
  "status" TEXT
);
INSERT INTO "orders" ("order_id", "customer", "city", "product", "quantity", "unit_price", "order_date", "status") VALUES
  ('001041', 'Nikodem Kamiński', 'Poznań', 'Desk lamp', '7', '195.66', '2026-01-06', 'paid'),
  ('001042', 'Antoni Szymański', 'Wrocław', 'Chair, ergonomic', '5', '106.18', '2026-02-07', 'refunded'),
  ('001043', 'Franciszek Kamiński', 'Gdańsk', 'USB-C cable', '1', '142.78', '2026-03-19', 'pending'),
  ('001044', 'Nikodem Lewandowski', 'Gdańsk', 'Coffee beans 1kg', '3', '155.57', '2026-04-26', 'shipped'),
  ('001045', 'Aleksander Nowak', 'Kraków', 'Desk lamp', '9', NULL, '2026-05-25', 'pending'),
  ('001046', 'Antoni Kowalski', 'Szczecin', 'Notebook A5', '6', '234.47', '2026-06-16', 'pending'),
  ('001047', ' Maja Kamiński ', 'Wrocław', 'Coffee beans 1kg', '6', '239.01', '2026-07-02', 'pending'),
  ('001048', 'Julia Wójcik', 'Gdańsk', 'USB-C cable', '8', '212.47', '2026-08-02', 'paid'),
  ('001049', 'Zofia Wójcik', 'Szczecin', 'Chair, ergonomic', '1', '29.67', '2026-09-08', 'refunded'),
  ('001050', 'Aleksander Wójcik', 'Poznań', 'Desk lamp', '7', '61.38', '2026-01-17', 'shipped'),
  ('001051', 'Jakub Nowak', 'Kraków', 'Chair, ergonomic', '3', '76.09', '2026-02-20', 'paid'),
  ('001052', 'Jan Wójcik', 'Poznań', 'Monitor 27"', '4', '57.81', '2026-03-01', 'refunded'),
  ('001053', 'Alicja Dąbrowski', 'Lublin', 'Desk lamp', '9', '110.39', '2026-04-07', 'pending'),
  ('001054', 'Hanna Kowalski', 'Wrocław', 'Notebook A5', '5', '36.16', '2026-05-11', 'paid'),
  ('001043', 'Franciszek Kamiński', 'Gdańsk', 'USB-C cable', '1', '142.78', '2026-03-19', 'pending');
COMMIT;

15 wierszy · 1 plik

Otwórz lub wklej plik CSV, wybierz Baza danych i Instrukcja, a skrypt pojawi się obok opcji. Domyślnie jest to transakcja PostgreSQL z instrukcją CREATE TABLE IF NOT EXISTS z kolumnami TEXT i instrukcjami INSERT po 100 wierszy, więc 00412 pozostaje '00412'. Wybierz Rozpoznawaj liczby i true/false, gdy tabela ma dostać kolumny liczbowe, logiczne i DATE. Plik jest konwertowany w Twojej przeglądarce i nigdy nie jest wysyłany na serwer.

Jak przekonwertować CSV do SQL

  1. Otwórz plik .csv, .tsv lub .txt, upuść go na narzędzie albo wklej wiersze. Ogranicznik jest wykrywany automatycznie; ogranicznik, wiersz nagłówka lub starsze kodowanie, np. Windows-1250 czy Windows-1252, ustawisz w sekcji Ustawienia importu.
  2. Wybierz Baza danych: PostgreSQL, MySQL / MariaDB, SQLite lub SQL Server. Sprawdź Nazwa tabeli – domyślnie to nazwa pliku, w której spacje i znaki interpunkcyjne zamieniono na podkreślenia (sales report.csv staje się sales_report).
  3. Wybierz Instrukcja, a przy UPSERT, UPDATE lub DELETE zaznacz Kolumny kluczowe, które identyfikują wiersz.
  4. Przejrzyj podgląd, a potem kliknij Kopiuj albo pobierz plik .sql i uruchom go w kliencie bazy danych, np. psql -f data.sql.

Aby wygenerować skrypty dla wielu plików z tymi samymi ustawieniami, wybierz Tryb wsadowy: konwertuj kilka plików. Każdy plik jest konwertowany po kolei, a skrypty pobierasz razem jako jeden plik ZIP.

Instrukcje i opcje

INSERTWielowierszowe instrukcje INSERT INTO … VALUES. Wierszy na jedno INSERT określa, ile wierszy trafia do jednej instrukcji (1–1000, domyślnie 100); SQL Server odrzuca więcej niż 1000.
UPSERT (wstaw lub zaktualizuj)Jedna instrukcja na wiersz, która wstawia go albo aktualizuje istniejący wiersz o tym samym kluczu: ON CONFLICT (…) DO UPDATE SET … = excluded.… w PostgreSQL i SQLite, ON DUPLICATE KEY UPDATE w MySQL oraz MERGE w SQL Server. Tabela docelowa wymaga klucza głównego lub indeksu unikatowego na kolumnach kluczowych.
UPDATEUPDATE … SET … WHERE key = … dla każdego wiersza; kolumny kluczowe się nie zmieniają. Jeśli wszystkie kolumny są kluczowe, nie ma czego aktualizować i żadne instrukcje nie są zapisywane.
DELETEDELETE FROM … WHERE key = … dla każdego wiersza. Pusta wartość klucza zmienia się w IS NULL.
Kolumny kluczoweWymagane przy UPSERT, UPDATE i DELETE; narzędzie nie zapisze żadnej z tych instrukcji bez klucza w WHERE. Przy opcji Dodaj CREATE TABLE kolumny kluczowe dostają NOT NULL i tworzą PRIMARY KEY.
Dodaj CREATE TABLEDomyślnie włączone. Zapisuje CREATE TABLE IF NOT EXISTS (zwykłe CREATE TABLE dla SQL Server albo po instrukcji DROP).
Najpierw dodaj DROP TABLE IF EXISTSZastępuje istniejącą tabelę o tej samej nazwie. Domyślnie wyłączone; po uruchomieniu skryptu stara tabela i jej dane przepadają.
Umieść w transakcjiDomyślnie włączone: BEGIN; … COMMIT; (START TRANSACTION; w MySQL, BEGIN TRANSACTION; w SQL Server).
Zapisuj puste komórki jako NULLDomyślnie włączone. Wyłącz, aby zamiast tego zapisywać puste komórki jako ''.

Typy kolumn i cudzysłowy

Przy opcji Zachowaj wszystkie wartości jako tekst (domyślnej) każda kolumna ma typ TEXT (NVARCHAR(MAX) w SQL Server), a każda wartość jest literałem tekstowym w cudzysłowie, więc zera wiodące, długie identyfikatory i nietypowe daty trafiają do bazy bez zmian.

Przy opcji Rozpoznawaj liczby i true/false kolumna dostaje typ tylko wtedy, gdy pasuje do niego każda niepusta wartość:

Liczby całkowiteINTEGER albo BIGINT, gdy wartość ma więcej niż 9 cyfr. Wartości są zapisywane bez cudzysłowów. Liczby z zerami wiodącymi lub większe niż 9 007 199 254 740 991 sprawiają, że kolumna pozostaje tekstowa.
Liczby dziesiętne (najwyżej 15 cyfr znaczących)NUMERIC w PostgreSQL, DECIMAL(p,s) z rozmiarem dobranym do danych w MySQL i SQL Server, REAL w SQLite. Przecinek dziesiętny, np. 1,5 – typowy dla polskich eksportów – sprawia, że kolumna pozostaje tekstowa.
true / false (dowolna wielkość liter)BOOLEAN z TRUE/FALSE w PostgreSQL i MySQL, BIT z 1/0 w SQL Server, INTEGER z 1/0 w SQLite.
Daty w formacie YYYY-MM-DDDATE z wartościami w cudzysłowie, np. '2026-03-01'; TEXT w SQLite. Daty z godziną i inne formaty dat pozostają tekstem.
  • Nazwy tabel i kolumn są cytowane dokładnie w zapisanej postaci, więc spacje, słowa zastrzeżone i nazwy z polskimi znakami działają: "order date" w PostgreSQL i SQLite, ` order date w MySQL, [order date]` w SQL Server. Znaki cudzysłowu wewnątrz nazwy są podwajane.
  • W wartościach apostrof jest podwajany (O'Brien staje się 'O''Brien'). W MySQL podwajane są też ukośniki wsteczne, bo MySQL domyślnie traktuje \ jako znak ucieczki. Literały SQL Server dostają przedrostek N, dzięki czemu tekst Unicode zostaje zachowany.
  • Podziały wiersza wewnątrz wartości CSV w cudzysłowie pozostają wewnątrz literału tekstowego SQL.
  • Znaków NUL większość baz danych nie potrafi przechować; są usuwane, a narzędzie podaje ich liczbę.

Rozwiązywanie problemów

  • Skrypt ma tylko jedną kolumnę. Ogranicznik został źle rozpoznany; ustaw go w sekcji Ustawienia importu i otwórz plik ponownie.
  • Kolumna liczbowa dostała typ TEXT. Co najmniej jedna wartość nie jest zwykłą liczbą, np. 12 kg, 1,5 lub 007. Znajdziesz ją w przeglądarce CSV albo poprawisz kolumnę w narzędziu Czyszczenie CSV.
  • UPSERT kończy się błędem brakującego ograniczenia. ON CONFLICT i ON DUPLICATE KEY działają tylko wtedy, gdy tabela docelowa ma klucz główny lub indeks unikatowy na kolumnach kluczowych. Dodaj indeks do istniejącej tabeli albo pozwól, by klucz utworzyła opcja Dodaj CREATE TABLE.
  • MySQL lub SQL Server odrzuca PRIMARY KEY. Kolumna kluczowa, która pozostaje tekstowa, jest tworzona jako TEXT (MySQL/MariaDB) lub NVARCHAR(MAX) (SQL Server), a żadna z tych baz nie potrafi w pełni indeksować takich typów. Utwórz tabelę samodzielnie z kluczem typu VARCHAR, a potem wyłącz Dodaj CREATE TABLE.
  • SQL Server zgłasza, że tabela już istnieje. Skrypty dla SQL Server używają zwykłego CREATE TABLE. Wyłącz Dodaj CREATE TABLE, aby wczytać dane do istniejącej tabeli, albo włącz Najpierw dodaj DROP TABLE IF EXISTS, aby ją zastąpić.
  • Skrypt zatrzymuje się w połowie. Komunikat błędu bazy danych wskazuje instrukcję, która się nie powiodła; najczęstsze przyczyny to zduplikowany klucz albo wartość niepasująca do typu kolumny istniejącej tabeli. Sprawdź plik narzędziem Walidacja CSV i uruchom skrypt ponownie.

Duże pliki i limity

Pliki do 25 MB, 100 000 wierszy lub 2 mln komórek otwierają się z podglądem na żywo. Większe pliki są konwertowane strumieniowo: podgląd pokazuje pierwsze 200 wierszy, plik jest odczytywany dwukrotnie we fragmentach (raz, aby poznać typy i szerokości kolumn, i drugi raz, aby zapisać skrypt), a pobrany plik obejmuje wszystkie wiersze. Pojedynczy skrypt może mieć najwyżej 4 GB.

Konwersja odbywa się w tle w tej karcie, więc strona cały czas reaguje, a Anuluj przerywa pracę. Plik CSV nigdy nie jest wysyłany na serwer. Aby zamiast skryptu dostać gotowy plik bazy danych, użyj narzędzia CSV do SQLite.

Przykład

Lista klientów z identyfikatorem z zerem wiodącym, nazwiskiem zawierającym apostrof i przecinek oraz pustym planem, przekonwertowana z ustawieniami domyślnymi i nazwą tabeli customers. Przy opcji Rozpoznawaj liczby i true/false kolumna signup_date dostaje typ DATE, monthly_fee – NUMERIC z wartością 29.00 bez cudzysłowów, a active – BOOLEAN z TRUE/FALSE, natomiast customer_id pozostaje TEXT.

CSV
customer_id,name,signup_date,plan,monthly_fee,active
00412,"O'Brien, Kate",2026-03-01,pro,29.00,true
00413,Luis Ortega,2026-03-04,,0,false
SQL (PostgreSQL)
BEGIN;
CREATE TABLE IF NOT EXISTS "customers" (
  "customer_id" TEXT,
  "name" TEXT,
  "signup_date" TEXT,
  "plan" TEXT,
  "monthly_fee" TEXT,
  "active" TEXT
);
INSERT INTO "customers" ("customer_id", "name", "signup_date", "plan", "monthly_fee", "active") VALUES
  ('00412', 'O''Brien, Kate', '2026-03-01', 'pro', '29.00', 'true'),
  ('00413', 'Luis Ortega', '2026-03-04', NULL, '0', 'false');
COMMIT;

Pytania i odpowiedzi

Dlaczego domyślnie każda kolumna ma typ TEXT?

CSV nie ma typów, a błędne zgadywanie powoduje utratę danych: identyfikator 00412 zapisany jako liczba całkowita staje się 412. Tekst wczytuje dokładnie to, co jest w pliku. Wybierz Rozpoznawaj liczby i true/false, gdy chcesz mieć kolumny liczbowe, logiczne i DATE.

Które bazy danych mogą uruchomić skrypt?

PostgreSQL, MySQL i MariaDB, SQLite oraz SQL Server – każda z własnym sposobem cytowania identyfikatorów, zabezpieczania tekstu, zapisu wartości logicznych i składnią UPSERT. Przed pobraniem wybierz właściwą Baza danych; skrypt napisany dla jednej z nich nie zadziała w pozostałych.

Czy narzędzie może wygenerować polecenia COPY lub LOAD DATA zamiast INSERT?

Nie. Skrypt używa standardowych instrukcji INSERT, UPSERT, UPDATE lub DELETE. Przy bardzo dużych importach rozważ wbudowane narzędzie do masowego ładowania danych w Twojej bazie, np. COPY w PostgreSQL lub LOAD DATA w MySQL, które odczytuje CSV bezpośrednio.

Standardy i źródła