Direkt zum Tool
ViewCSV
Kein Datei-Upload

CSV in SQL umwandeln

orders.csv· BEISPIELDATEN15 Zeilen · 8 Spalten
Schlüsselspalten
Erforderlich für UPSERT, UPDATE und DELETE; beim Anlegen der Tabelle als Primärschlüssel verwendet.
Werttypen
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', 'Laura Koch', 'Leipzig', 'Monitor 27"', '4', '180.60', '2026-01-15', 'shipped'),
  ('001042', 'Mia Müller', 'Köln', 'Coffee beans 1kg', '3', '156.81', '2026-02-26', 'refunded'),
  ('001043', 'Anna Fischer', 'Leipzig', 'Notebook A5', '1', '229.89', '2026-03-17', 'refunded'),
  ('001044', 'Jonas Wagner', 'Berlin', 'Notebook A5', '9', '80.03', '2026-04-23', 'paid'),
  ('001045', 'Anna Koch', 'Dresden', 'Monitor 27"', '5', NULL, '2026-05-24', 'pending'),
  ('001046', 'Felix Becker', 'Frankfurt am Main', 'Coffee beans 1kg', '5', '93.26', '2026-06-08', 'refunded'),
  ('001047', ' Lena Koch ', 'München', 'Coffee beans 1kg', '3', '102.06', '2026-07-26', 'pending'),
  ('001048', 'Sophie Schmidt', 'Frankfurt am Main', 'Desk lamp', '1', '215.25', '2026-08-03', 'paid'),
  ('001049', 'Leon Müller', 'Frankfurt am Main', 'USB-C cable', '6', '89.20', '2026-09-03', 'paid'),
  ('001050', 'Leon Meyer', 'Berlin', 'Notebook A5', '1', '101.11', '2026-01-10', 'refunded'),
  ('001051', 'Leon Bauer', 'Frankfurt am Main', 'Notebook A5', '9', '142.33', '2026-02-01', 'refunded'),
  ('001052', 'Felix Schäfer', 'Hamburg', 'Monitor 27"', '4', '161.36', '2026-03-24', 'shipped'),
  ('001053', 'Max Wagner', 'Hamburg', 'Monitor 27"', '1', '184.33', '2026-04-13', 'paid'),
  ('001054', 'Jonas Müller', 'Hamburg', 'Desk lamp', '8', '205.98', '2026-05-06', 'pending'),
  ('001043', 'Anna Fischer', 'Leipzig', 'Notebook A5', '1', '229.89', '2026-03-17', 'refunded');
COMMIT;

15 Zeilen · 1 Datei

Öffnen Sie eine CSV-Datei oder fügen Sie sie ein, wählen Sie Datenbank und Anweisung, und das Skript erscheint neben den Optionen. Standardmäßig ist es eine PostgreSQL-Transaktion mit einem CREATE TABLE IF NOT EXISTS aus TEXT-Spalten und INSERTs mit je 100 Zeilen – 00412 bleibt also '00412'. Wählen Sie Zahlen und true/false erkennen, wenn die Tabelle numerische, boolesche und DATE-Spalten erhalten soll. Die Datei wird in Ihrem Browser umgewandelt und nie hochgeladen.

So wandeln Sie CSV in SQL um

  1. Öffnen Sie eine .csv-, .tsv- oder .txt-Datei, ziehen Sie sie auf das Werkzeug, oder fügen Sie Zeilen ein. Das Trennzeichen wird erkannt; Trennzeichen, Kopfzeile oder eine ältere Codierung wie Windows-1252 stellen Sie unter Importeinstellungen ein.
  2. Wählen Sie die Datenbank: PostgreSQL, MySQL / MariaDB, SQLite oder SQL Server. Prüfen Sie das Feld Tabellenname: Der Name beginnt als Dateiname, wobei Leerzeichen und Satzzeichen zu Unterstrichen werden (aus sales report.csv wird sales_report).
  3. Wählen Sie die Anweisung und haken Sie bei UPSERT, UPDATE oder DELETE die Schlüsselspalten an, die eine Zeile kennzeichnen.
  4. Prüfen Sie die Vorschau, wählen Sie dann Kopieren oder laden Sie die .sql-Datei herunter, und führen Sie sie mit Ihrem Datenbank-Client aus, zum Beispiel mit psql -f data.sql.

Um viele Dateien mit denselben Einstellungen in Skripte umzuwandeln, wählen Sie Stapelverarbeitung: mehrere Dateien umwandeln. Jede Datei wird nacheinander umgewandelt, und die Skripte werden zusammen als eine ZIP-Datei heruntergeladen.

Anweisungen und Optionen

INSERTMehrzeilige Anweisungen INSERT INTO … VALUES. Zeilen pro INSERT legt fest, wie viele Zeilen sich eine Anweisung teilen (1–1.000, Standard 100); SQL Server lehnt mehr als 1.000 ab.
UPSERT (einfügen oder aktualisieren)Eine Anweisung pro Zeile, die sie einfügt oder die vorhandene Zeile mit demselben Schlüssel aktualisiert: ON CONFLICT (…) DO UPDATE SET … = excluded.… in PostgreSQL und SQLite, ON DUPLICATE KEY UPDATE in MySQL und MERGE in SQL Server. Die Zieltabelle braucht einen Primärschlüssel oder eindeutigen Index auf den Schlüsselspalten.
UPDATEUPDATE … SET … WHERE key = … für jede Zeile; Schlüsselspalten werden nicht geändert. Ist jede Spalte ein Schlüssel, gibt es nichts zu aktualisieren, und es werden keine Anweisungen geschrieben.
DELETEDELETE FROM … WHERE key = … für jede Zeile. Ein leerer Schlüsselwert wird zu IS NULL.
SchlüsselspaltenPflicht für UPSERT, UPDATE und DELETE; ohne WHERE-Schlüssel schreibt das Werkzeug keine dieser Anweisungen. Mit CREATE TABLE hinzufügen werden Schlüsselspalten NOT NULL und bilden den PRIMARY KEY.
CREATE TABLE hinzufügenStandardmäßig an. Schreibt CREATE TABLE IF NOT EXISTS (ein einfaches CREATE TABLE für SQL Server oder nach einem DROP).
Vorher DROP TABLE IF EXISTS einfügenErsetzt eine vorhandene Tabelle gleichen Namens. Standardmäßig aus; die alte Tabelle samt Daten geht beim Ausführen des Skripts verloren.
In eine Transaktion einschließenStandardmäßig an: BEGIN; … COMMIT; (START TRANSACTION; in MySQL, BEGIN TRANSACTION; in SQL Server).
Leere Zellen als NULL schreibenStandardmäßig an. Ausschalten, um leere Zellen stattdessen als '' zu schreiben.

Spaltentypen und Anführungszeichen

Mit Alle Werte als Text behalten (Standard) ist jede Spalte TEXT (NVARCHAR(MAX) in SQL Server) und jeder Wert ein Zeichenketten-Literal in Anführungszeichen. Führende Nullen, lange IDs und ungewöhnliche Datumsangaben werden also unverändert geladen.

Mit Zahlen und true/false erkennen erhält eine Spalte nur dann einen Typ, wenn jeder nicht leere Wert dazu passt:

Ganze ZahlenINTEGER oder BIGINT, wenn ein Wert mehr als 9 Stellen hat. Die Werte werden ohne Anführungszeichen geschrieben. Zahlen mit führenden Nullen oder jenseits von 9.007.199.254.740.991 lassen die Spalte Text bleiben.
Dezimalzahlen (höchstens 15 signifikante Stellen)NUMERIC in PostgreSQL, DECIMAL(p,s) mit aus den Daten ermittelter Größe in MySQL und SQL Server, REAL in SQLite. Ein Dezimalkomma wie in 1,5 lässt die Spalte Text bleiben – Beträge aus deutschen Exporten werden also nicht als Zahlen erkannt.
true / false (beliebige Schreibweise)BOOLEAN mit TRUE/FALSE in PostgreSQL und MySQL, BIT mit 1/0 in SQL Server, INTEGER mit 1/0 in SQLite.
Datumswerte im Format YYYY-MM-DDDATE mit Werten in Anführungszeichen wie '2026-03-01'; in SQLite TEXT. Datum mit Uhrzeit und andere Datumsformate bleiben Text.
  • Tabellen- und Spaltennamen werden genau wie geschrieben in Anführungszeichen gesetzt, sodass Leerzeichen, reservierte Wörter und nicht lateinische Namen funktionieren: "order date" in PostgreSQL und SQLite, ` order date in MySQL, [order date]` in SQL Server. Enthaltene Anführungszeichen werden verdoppelt.
  • In Werten wird ein einfaches Anführungszeichen verdoppelt (aus O'Brien wird 'O''Brien'). Für MySQL werden auch Backslashes verdoppelt, weil MySQL \ standardmäßig als Escape-Zeichen behandelt. SQL-Server-Literale erhalten das Präfix N, damit Unicode-Text erhalten bleibt.
  • Zeilenumbrüche in einem CSV-Wert in Anführungszeichen bleiben im SQL-Zeichenketten-Literal erhalten.
  • NUL-Zeichen können die meisten Datenbanken nicht speichern; sie werden entfernt, und das Werkzeug meldet, wie viele es waren.

Fehlerbehebung

  • Das Skript besteht aus einer einzigen Spalte. Das Trennzeichen wurde falsch erkannt. Stellen Sie es unter Importeinstellungen ein und öffnen Sie die Datei erneut.
  • Eine Zahlenspalte wurde zu TEXT. Mindestens ein Wert ist keine einfache Zahl, zum Beispiel 12 kg, 1,5 oder 007. Finden Sie ihn im CSV-Viewer oder korrigieren Sie die Spalte mit CSV bereinigen.
  • Das UPSERT scheitert an einer fehlenden Einschränkung. ON CONFLICT und ON DUPLICATE KEY funktionieren nur, wenn die Zieltabelle einen Primärschlüssel oder eindeutigen Index auf den Schlüsselspalten hat. Ergänzen Sie den Index in der vorhandenen Tabelle, oder lassen Sie den Schlüssel von CREATE TABLE hinzufügen anlegen.
  • MySQL oder SQL Server lehnt den PRIMARY KEY ab. Eine Schlüsselspalte, die Text bleibt, wird als TEXT (MySQL/MariaDB) bzw. NVARCHAR(MAX) (SQL Server) angelegt, und keine der beiden Datenbanken kann diese Typen vollständig indizieren. Legen Sie die Tabelle selbst mit einem VARCHAR-Schlüssel an und schalten Sie dann CREATE TABLE hinzufügen aus.
  • SQL Server meldet, dass die Tabelle bereits existiert. SQL-Server-Skripte verwenden ein einfaches CREATE TABLE. Schalten Sie CREATE TABLE hinzufügen aus, um in die vorhandene Tabelle zu laden, oder schalten Sie Vorher DROP TABLE IF EXISTS einfügen ein, um sie zu ersetzen.
  • Das Skript bricht mittendrin ab. Die Fehlermeldung der Datenbank nennt die fehlgeschlagene Anweisung; meist liegt es an einem doppelten Schlüssel oder an einem Wert, der nicht zum Spaltentyp einer vorhandenen Tabelle passt. Prüfen Sie die Datei mit CSV validieren und führen Sie das Skript erneut aus.

Große Dateien und Grenzen

Dateien bis 25 MB, 100.000 Zeilen oder 2 Millionen Zellen öffnen mit Live-Vorschau. Größere Dateien werden als Datenstrom umgewandelt: Die Vorschau zeigt die ersten 200 Zeilen, die Datei wird zweimal abschnittsweise gelesen (einmal, um Spaltentypen und -breiten zu ermitteln, einmal, um das Skript zu schreiben), und der Download umfasst jede Zeile. Ein einzelnes Skript ist auf 4 GB begrenzt.

Die Umwandlung läuft in einem Hintergrund-Worker in diesem Tab; die Seite bleibt bedienbar, und Abbrechen beendet den Vorgang. Die CSV-Datei wird nie an einen Server gesendet. Um statt eines Skripts eine fertige Datenbankdatei zu erhalten, nutzen Sie CSV in SQLite.

Beispiel

Eine Kundenliste mit einer ID mit führender Null, einem Namen mit Apostroph und Komma sowie einem leeren Tarif, umgewandelt mit den Standardeinstellungen und dem Tabellennamen customers. Mit Zahlen und true/false erkennen wird signup_date zu DATE, monthly_fee zu NUMERIC mit 29.00 ohne Anführungszeichen und active zu BOOLEAN mit TRUE/FALSE, während customer_id TEXT bleibt.

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;

Fragen und Antworten

Warum ist standardmäßig jede Spalte TEXT?

CSV kennt keine Typen, und falsch geratene Typen kosten Daten: Eine ID wie 00412, als Ganzzahl gespeichert, wird zu 412. Als Text wird genau das geladen, was in der Datei steht. Wählen Sie Zahlen und true/false erkennen, wenn Sie numerische, boolesche und DATE-Spalten möchten.

Welche Datenbanken können das Skript ausführen?

PostgreSQL, MySQL und MariaDB, SQLite sowie SQL Server, jeweils mit eigener Schreibweise für Bezeichner, Zeichenketten-Escapes, Wahrheitswerte und Upsert-Syntax. Wählen Sie vor dem Download die passende Datenbank; ein Skript für die eine lässt sich nicht auf die anderen übertragen.

Kann es statt INSERTs auch COPY- oder LOAD-DATA-Befehle erzeugen?

Nein. Das Skript verwendet Standardanweisungen INSERT, UPSERT, UPDATE oder DELETE. Für sehr große Ladevorgänge ist der eigene Massenlader Ihrer Datenbank eine Überlegung wert, etwa COPY in PostgreSQL oder LOAD DATA in MySQL, der die CSV-Datei direkt liest.

Standards und Quellen