Ö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
- Ö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. - 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.csvwirdsales_report). - Wählen Sie die Anweisung und haken Sie bei UPSERT, UPDATE oder DELETE die Schlüsselspalten an, die eine Zeile kennzeichnen.
- 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 mitpsql -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
| INSERT | Mehrzeilige 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. |
| UPDATE | UPDATE … 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. |
| DELETE | DELETE FROM … WHERE key = … für jede Zeile. Ein leerer Schlüsselwert wird zu IS NULL. |
| Schlüsselspalten | Pflicht 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ügen | Standardmäß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ügen | Ersetzt eine vorhandene Tabelle gleichen Namens. Standardmäßig aus; die alte Tabelle samt Daten geht beim Ausführen des Skripts verloren. |
| In eine Transaktion einschließen | Standardmäßig an: BEGIN; … COMMIT; (START TRANSACTION; in MySQL, BEGIN TRANSACTION; in SQL Server). |
| Leere Zellen als NULL schreiben | Standardmäß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 Zahlen | INTEGER 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-DD | DATE 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 datein MySQL,[order date]` in SQL Server. Enthaltene Anführungszeichen werden verdoppelt. - In Werten wird ein einfaches Anführungszeichen verdoppelt (aus
O'Brienwird'O''Brien'). Für MySQL werden auch Backslashes verdoppelt, weil MySQL\standardmäßig als Escape-Zeichen behandelt. SQL-Server-Literale erhalten das PräfixN, 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,5oder007. Finden Sie ihn im CSV-Viewer oder korrigieren Sie die Spalte mit CSV bereinigen. - Das UPSERT scheitert an einer fehlenden Einschränkung.
ON CONFLICTundON DUPLICATE KEYfunktionieren 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 einemVARCHAR-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.
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
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.