Direct naar de tool
ViewCSV
Niets wordt geüpload

CSV omzetten naar SQL

orders.csv· VOORBEELDGEGEVENS15 rijen · 8 kolommen
Sleutelkolommen
Verplicht voor UPSERT, UPDATE en DELETE; bij het aanmaken van de tabel gebruikt als primaire sleutel.
Waardetypen
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', 'Julia Jansen', 'Den Haag', 'Monitor 27"', '7', '19.63', '2026-01-16', 'refunded'),
  ('001042', 'Finn Jansen', 'Groningen', 'Coffee beans 1kg', '4', '61.32', '2026-02-07', 'paid'),
  ('001043', 'Noah de Boer', 'Utrecht', 'Monitor 27"', '7', '5.83', '2026-03-18', 'paid'),
  ('001044', 'Emma Meijer', 'Amsterdam', 'Chair, ergonomic', '3', '74.88', '2026-04-22', 'refunded'),
  ('001045', 'Julia Janssen', 'Utrecht', 'Notebook A5', '5', NULL, '2026-05-02', 'shipped'),
  ('001046', 'Julia Bakker', 'Gent', 'Chair, ergonomic', '8', '113.31', '2026-06-17', 'shipped'),
  ('001047', ' Daan van Dijk ', 'Den Haag', 'USB-C cable', '1', '48.13', '2026-07-06', 'pending'),
  ('001048', 'Julia van den Berg', 'Groningen', 'Notebook A5', '1', '73.68', '2026-08-07', 'pending'),
  ('001049', 'Julia van Dijk', 'Eindhoven', 'Chair, ergonomic', '3', '102.72', '2026-09-01', 'shipped'),
  ('001050', 'Finn de Jong', 'Antwerpen', 'Monitor 27"', '3', '137.32', '2026-01-04', 'pending'),
  ('001051', 'Tess Janssen', 'Den Haag', 'Notebook A5', '9', '125.22', '2026-02-12', 'refunded'),
  ('001052', 'Julia de Jong', 'Groningen', 'Desk lamp', '5', '62.89', '2026-03-04', 'shipped'),
  ('001053', 'Zoë Meijer', 'Rotterdam', 'Notebook A5', '1', '127.86', '2026-04-09', 'pending'),
  ('001054', 'Sophie Visser', 'Antwerpen', 'Chair, ergonomic', '2', '99.73', '2026-05-13', 'pending'),
  ('001043', 'Noah de Boer', 'Utrecht', 'Monitor 27"', '7', '5.83', '2026-03-18', 'paid');
COMMIT;

15 rijen · 1 bestand

Open of plak een CSV-bestand, kies de Database en de Opdracht, en het script verschijnt naast de opties. Standaard is het een PostgreSQL-transactie met een CREATE TABLE IF NOT EXISTS met TEXT-kolommen en INSERT’s van 100 rijen per stuk, zodat 00412 gewoon '00412' blijft. Kies Getallen en true/false herkennen als de tabel numerieke, booleaanse en DATE-kolommen moet krijgen. Het bestand wordt in je browser omgezet en nooit geüpload.

Zo zet je CSV om naar SQL

  1. Open een .csv-, .tsv- of .txt-bestand, sleep het naar de tool of plak rijen. Het scheidingsteken wordt herkend. Stel het scheidingsteken, de kopregel of een oudere codering zoals Windows-1252 in onder Importinstellingen.
  2. Kies de Database: PostgreSQL, MySQL / MariaDB, SQLite of SQL Server. Controleer de Tabelnaam: die begint als de bestandsnaam, met spaties en leestekens omgezet in underscores (sales report.csv wordt sales_report).
  3. Kies de Opdracht en vink voor UPSERT, UPDATE of DELETE de Sleutelkolommen aan die een rij herkenbaar maken.
  4. Bekijk het voorbeeld en kies daarna Kopiëren, of download het .sql-bestand en voer het uit met je databaseclient, bijvoorbeeld psql -f data.sql.

Wil je van veel bestanden met dezelfde instellingen een script maken? Kies dan Batch: meerdere bestanden omzetten. Elk bestand wordt om de beurt omgezet, en de scripts worden samen als één ZIP-bestand gedownload.

Opdrachten en opties

INSERTINSERT INTO … VALUES-opdrachten met meerdere rijen. Rijen per INSERT bepaalt hoeveel rijen één opdracht delen (1–1.000, standaard 100); SQL Server weigert meer dan 1.000.
UPSERT (invoegen of bijwerken)Eén opdracht per rij die de rij invoegt of de bestaande rij met dezelfde sleutel bijwerkt: ON CONFLICT (…) DO UPDATE SET … = excluded.… in PostgreSQL en SQLite, ON DUPLICATE KEY UPDATE in MySQL en MERGE in SQL Server. De doeltabel heeft een primaire sleutel of unieke index op de sleutelkolommen nodig.
UPDATEUPDATE … SET … WHERE key = … voor elke rij; sleutelkolommen worden niet gewijzigd. Is elke kolom een sleutel, dan valt er niets bij te werken en worden er geen opdrachten geschreven.
DELETEDELETE FROM … WHERE key = … voor elke rij. Een lege sleutelwaarde wordt IS NULL.
SleutelkolommenVerplicht voor UPSERT, UPDATE en DELETE; de tool schrijft zo’n opdracht nooit zonder WHERE-sleutel. Met CREATE TABLE toevoegen worden sleutelkolommen NOT NULL en de PRIMARY KEY.
CREATE TABLE toevoegenStandaard aan. Schrijft CREATE TABLE IF NOT EXISTS (gewoon CREATE TABLE bij SQL Server, of na een DROP).
Eerst DROP TABLE IF EXISTS toevoegenVervangt een bestaande tabel met dezelfde naam. Standaard uit; de oude tabel en de gegevens erin gaan verloren als het script wordt uitgevoerd.
In een transactie plaatsenStandaard aan: BEGIN; … COMMIT; (START TRANSACTION; in MySQL, BEGIN TRANSACTION; in SQL Server).
Lege cellen als NULL schrijvenStandaard aan. Zet het uit om lege cellen als '' te schrijven.

Kolomtypen en aanhalingstekens

Met Alle waarden als tekst bewaren (de standaard) is elke kolom TEXT (NVARCHAR(MAX) in SQL Server) en is elke waarde een string tussen aanhalingstekens. Voorloopnullen, lange nummers en afwijkende datums worden dus ongewijzigd geladen.

Met Getallen en true/false herkennen krijgt een kolom alleen een type als elke niet-lege waarde erin past:

Gehele getallenINTEGER, of BIGINT als een waarde meer dan 9 cijfers heeft. Waarden worden zonder aanhalingstekens geschreven. Getallen met voorloopnullen of boven 9.007.199.254.740.991 houden de kolom op tekst.
Decimale getallen (maximaal 15 significante cijfers)NUMERIC in PostgreSQL, DECIMAL(p,s) met een grootte op basis van de gegevens in MySQL en SQL Server, REAL in SQLite. Een decimale komma zoals 1,5 houdt de kolom op tekst.
true / false (in welke schrijfwijze ook)BOOLEAN met TRUE/FALSE in PostgreSQL en MySQL, BIT met 1/0 in SQL Server, INTEGER met 1/0 in SQLite.
Datums als YYYY-MM-DDDATE, met waarden tussen aanhalingstekens zoals '2026-03-01'; TEXT in SQLite. Datums met tijd en andere datumnotaties blijven tekst.
  • Tabel- en kolomnamen worden precies zo tussen aanhalingstekens gezet als ze er staan, dus spaties, gereserveerde woorden en niet-Latijnse namen werken: "order date" in PostgreSQL en SQLite, ` order date in MySQL, [order date]` in SQL Server. Aanhalingstekens in een naam worden verdubbeld.
  • In waarden wordt een enkel aanhalingsteken verdubbeld (O'Brien wordt 'O''Brien'). Voor MySQL worden ook backslashes verdubbeld, omdat MySQL \ standaard als escape ziet. Strings voor SQL Server krijgen het voorvoegsel N, zodat Unicode-tekst behouden blijft.
  • Regeleinden binnen een CSV-waarde tussen aanhalingstekens blijven binnen de SQL-string.
  • NUL-tekens kunnen de meeste databases niet opslaan; die worden verwijderd, en de tool meldt hoeveel.

Problemen oplossen

  • Het script bestaat uit één kolom. Het scheidingsteken is verkeerd geraden. Stel het in onder Importinstellingen en open het bestand opnieuw.
  • Een kolom met getallen is TEXT geworden. Minstens één waarde is geen gewoon getal, bijvoorbeeld 12 kg, 1,5 of 007. Zoek hem op in de CSV-viewer of herstel de kolom met CSV opschonen. Bedragen met een decimale komma uit een Nederlandse export houden de kolom dus op tekst.
  • De UPSERT mislukt door een ontbrekende constraint. ON CONFLICT en ON DUPLICATE KEY werken alleen als de doeltabel een primaire sleutel of unieke index op de sleutelkolommen heeft. Voeg de index toe aan de bestaande tabel, of laat CREATE TABLE toevoegen de sleutel aanmaken.
  • MySQL of SQL Server weigert de PRIMARY KEY. Een sleutelkolom die tekst blijft, wordt aangemaakt als TEXT (MySQL/MariaDB) of NVARCHAR(MAX) (SQL Server), en geen van beide databases kan die typen volledig indexeren. Maak de tabel zelf aan met een VARCHAR-sleutel en zet daarna CREATE TABLE toevoegen uit.
  • SQL Server meldt dat de tabel al bestaat. Scripts voor SQL Server gebruiken gewoon CREATE TABLE. Zet CREATE TABLE toevoegen uit om in de bestaande tabel te laden, of zet Eerst DROP TABLE IF EXISTS toevoegen aan om hem te vervangen.
  • Het script stopt halverwege. De databasefout noemt de opdracht die mislukt; meestal is de oorzaak een dubbele sleutel, of een waarde die niet past in een kolomtype van een bestaande tabel. Controleer het bestand met CSV valideren en voer het script opnieuw uit.

Grote bestanden en grenzen

Bestanden tot 25 MB, 100.000 rijen of 2 miljoen cellen openen met een live voorbeeld. Grotere bestanden worden in delen omgezet: het voorbeeld toont de eerste 200 rijen, het bestand wordt twee keer in stukken gelezen (eerst om de kolomtypen en breedtes te leren, dan om het script te schrijven), en de download bevat alle rijen. Eén script is maximaal 4 GB.

Het omzetten gebeurt in een achtergrondproces in dit tabblad, zodat de pagina blijft reageren; met Annuleren stop je het. Het CSV-bestand wordt nooit naar een server gestuurd. Wil je een kant-en-klaar databasebestand in plaats van een script, gebruik dan CSV naar SQLite.

Voorbeeld

Een klantenlijst met een nummer met voorloopnullen, een naam met een apostrof en een komma, en een leeg abonnement, omgezet met de standaardinstellingen en de tabelnaam customers. Met Getallen en true/false herkennen wordt signup_date DATE, monthly_fee NUMERIC met 29.00 zonder aanhalingstekens, en active BOOLEAN met TRUE/FALSE, terwijl customer_id TEXT blijft.

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;

Vragen en antwoorden

Waarom is elke kolom standaard TEXT?

CSV kent geen typen, en verkeerd raden kost gegevens: een nummer als 00412 dat als geheel getal wordt opgeslagen, wordt 412. Als tekst wordt precies geladen wat er in het bestand staat. Kies Getallen en true/false herkennen als je numerieke, booleaanse en DATE-kolommen wilt.

Welke databases kunnen het script uitvoeren?

PostgreSQL, MySQL en MariaDB, SQLite en SQL Server, elk met hun eigen aanhalingstekens voor namen, escaping van strings, booleaanse waarden en upsert-syntaxis. Kies de juiste Database voordat je downloadt; een script voor de ene database werkt niet zomaar in de andere.

Kan de tool COPY- of LOAD DATA-opdrachten maken in plaats van INSERT’s?

Nee. Het script gebruikt gewone INSERT-, UPSERT-, UPDATE- of DELETE-opdrachten. Voor heel grote hoeveelheden kun je beter de eigen bulkloader van je database gebruiken, zoals COPY in PostgreSQL of LOAD DATA in MySQL, die de CSV rechtstreeks inleest.

Standaarden en bronnen