Langsung ke alat
ViewCSV
File tidak diunggah

Konversi CSV ke SQL

orders.csv· DATA CONTOH15 baris · 8 kolom
Kolom kunci
Wajib untuk UPSERT, UPDATE, dan DELETE; dipakai sebagai primary key saat membuat tabel.
Tipe nilai
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', 'Budi Lestari', 'Jakarta', 'Desk lamp', '1', '204.83', '2026-01-19', 'shipped'),
  ('001042', 'Andi Wijaya', 'Bandung', 'Desk lamp', '1', '139.94', '2026-02-26', 'refunded'),
  ('001043', 'Siti Saputra', 'Medan', 'Chair, ergonomic', '3', '128.52', '2026-03-01', 'pending'),
  ('001044', 'Rizky Kurniawan', 'Medan', 'Coffee beans 1kg', '4', '229.71', '2026-04-27', 'refunded'),
  ('001045', 'Rizky Lestari', 'Jakarta', 'Monitor 27"', '8', NULL, '2026-05-09', 'pending'),
  ('001046', 'Fajar Gunawan', 'Bandung', 'Monitor 27"', '4', '221.25', '2026-06-20', 'refunded'),
  ('001047', ' Fajar Saputra ', 'Yogyakarta', 'USB-C cable', '3', '22.40', '2026-07-04', 'refunded'),
  ('001048', 'Rizky Wijaya', 'Bandung', 'Monitor 27"', '2', '157.07', '2026-08-11', 'refunded'),
  ('001049', 'Andi Lestari', 'Yogyakarta', 'Coffee beans 1kg', '2', '219.18', '2026-09-10', 'shipped'),
  ('001050', 'Nur Halim', 'Medan', 'USB-C cable', '1', '210.97', '2026-01-15', 'refunded'),
  ('001051', 'Putri Halim', 'Medan', 'USB-C cable', '8', '136.07', '2026-02-25', 'shipped'),
  ('001052', 'Rizky Hidayat', 'Denpasar', 'Desk lamp', '3', '9.42', '2026-03-05', 'refunded'),
  ('001053', 'Budi Kurniawan', 'Bandung', 'Notebook A5', '5', '174.88', '2026-04-25', 'pending'),
  ('001054', 'Putri Kurniawan', 'Bandung', 'Desk lamp', '2', '103.84', '2026-05-15', 'paid'),
  ('001043', 'Siti Saputra', 'Medan', 'Chair, ergonomic', '3', '128.52', '2026-03-01', 'pending');
COMMIT;

15 baris · 1 file

Buka atau tempel file CSV, pilih Database dan Perintah, dan skripnya langsung tampil di samping opsi. Secara bawaan hasilnya berupa transaksi PostgreSQL dengan CREATE TABLE IF NOT EXISTS berkolom TEXT dan INSERT berisi 100 baris per perintah, jadi 00412 tetap '00412'. Pilih Deteksi angka dan true/false jika tabel harus punya kolom angka, boolean, dan DATE. File dikonversi di browser Anda dan tidak pernah diunggah.

Cara mengonversi CSV ke SQL

  1. Buka file .csv, .tsv, atau .txt, seret ke alat ini, atau tempel barisnya. Pemisah dikenali otomatis; atur pemisah, baris judul kolom, atau pengodean lama seperti Windows-1252 di Pengaturan impor.
  2. Pilih Database: PostgreSQL, MySQL / MariaDB, SQLite, atau SQL Server. Periksa Nama tabel, yang awalnya diambil dari nama file dengan spasi dan tanda baca diganti garis bawah (sales report.csv menjadi sales_report).
  3. Pilih Perintah, dan untuk UPSERT, UPDATE, atau DELETE, centang Kolom kunci yang mengenali setiap baris.
  4. Tinjau pratinjaunya, lalu pilih Salin atau unduh file .sql dan jalankan dengan klien database Anda, misalnya psql -f data.sql.

Untuk membuat skrip dari banyak file dengan pengaturan yang sama, pilih Batch: konversi beberapa file. Setiap file dikonversi bergiliran, dan semua skripnya diunduh bersama dalam satu ZIP.

Perintah dan opsi

INSERTPerintah INSERT INTO … VALUES berisi banyak baris. Baris per INSERT menentukan berapa baris dalam satu perintah (1–1.000, bawaan 100); SQL Server menolak lebih dari 1.000.
UPSERT (tambah atau perbarui)Satu perintah per baris yang menyisipkan baris itu atau memperbarui baris yang sudah ada dengan kunci yang sama: ON CONFLICT (…) DO UPDATE SET … = excluded.… di PostgreSQL dan SQLite, ON DUPLICATE KEY UPDATE di MySQL, dan MERGE di SQL Server. Tabel tujuan memerlukan primary key atau unique index pada kolom kuncinya.
UPDATEUPDATE … SET … WHERE key = … untuk setiap baris; kolom kunci tidak diubah. Jika semua kolom adalah kunci, tidak ada yang perlu diperbarui dan tidak ada perintah yang ditulis.
DELETEDELETE FROM … WHERE key = … untuk setiap baris. Nilai kunci yang kosong menjadi IS NULL.
Kolom kunciWajib untuk UPSERT, UPDATE, dan DELETE; alat ini tidak akan menulis perintah-perintah tersebut tanpa kunci WHERE. Dengan Tambahkan CREATE TABLE, kolom kunci menjadi NOT NULL dan PRIMARY KEY.
Tambahkan CREATE TABLEAktif secara bawaan. Menulis CREATE TABLE IF NOT EXISTS (CREATE TABLE biasa untuk SQL Server, atau setelah DROP).
Awali dengan DROP TABLE IF EXISTSMengganti tabel yang sudah ada dengan nama yang sama. Nonaktif secara bawaan; tabel lama beserta datanya hilang saat skrip dijalankan.
Bungkus dalam transaksiAktif secara bawaan: BEGIN; … COMMIT; (START TRANSACTION; di MySQL, BEGIN TRANSACTION; di SQL Server).
Tulis sel kosong sebagai NULLAktif secara bawaan. Nonaktifkan untuk menulis sel kosong sebagai ''.

Tipe kolom dan tanda kutip

Dengan Simpan semua nilai sebagai teks (bawaan), setiap kolom bertipe TEXT (NVARCHAR(MAX) di SQL Server) dan setiap nilai menjadi literal string bertanda kutip, sehingga angka nol di depan, ID panjang seperti NIK, dan tanggal yang tidak lazim dimuat tanpa perubahan.

Dengan Deteksi angka dan true/false, sebuah kolom hanya mendapat tipe jika setiap nilai yang tidak kosong sesuai dengan tipe itu:

Bilangan bulatINTEGER, atau BIGINT jika ada nilai yang lebih dari 9 digit. Nilai ditulis tanpa tanda kutip. Angka dengan nol di depan atau yang melebihi 9.007.199.254.740.991 membuat kolom tetap teks.
Desimal (maksimal 15 digit signifikan)NUMERIC di PostgreSQL, DECIMAL(p,s) yang ukurannya disesuaikan dengan data di MySQL dan SQL Server, REAL di SQLite. Koma desimal seperti 1,5 membuat kolom tetap teks.
true / false (huruf besar/kecil apa pun)BOOLEAN dengan TRUE/FALSE di PostgreSQL dan MySQL, BIT dengan 1/0 di SQL Server, INTEGER dengan 1/0 di SQLite.
Tanggal berformat YYYY-MM-DDDATE, dengan nilai bertanda kutip seperti '2026-03-01'; TEXT di SQLite. Tanggal-waktu dan format tanggal lain tetap teks.
  • Nama tabel dan kolom diberi tanda kutip persis seperti tertulis, jadi spasi, kata yang dicadangkan, dan nama non-Latin tetap berfungsi: "order date" di PostgreSQL dan SQLite, ` order date di MySQL, [order date]` di SQL Server. Karakter kutip di dalam nama digandakan.
  • Dalam nilai, tanda kutip tunggal digandakan (O'Brien menjadi 'O''Brien'). Untuk MySQL, garis miring terbalik juga digandakan, karena MySQL secara bawaan memperlakukan \ sebagai escape. Literal SQL Server diberi awalan N agar teks Unicode tetap utuh.
  • Baris baru di dalam nilai CSV bertanda kutip tetap berada di dalam literal string SQL.
  • Karakter NUL tidak bisa disimpan di kebanyakan database; karakter itu dihapus dan alat ini melaporkan jumlahnya.

Mengatasi masalah

  • Skripnya hanya berisi satu kolom. Pemisahnya salah ditebak; atur di Pengaturan impor lalu buka ulang file.
  • Kolom angka keluar sebagai TEXT. Setidaknya ada satu nilai yang bukan angka biasa, misalnya 12 kg, 1,5, atau 007. Temukan di penampil CSV atau perbaiki kolomnya dengan Rapikan CSV.
  • UPSERT gagal karena constraint tidak ada. ON CONFLICT dan ON DUPLICATE KEY hanya berfungsi jika tabel tujuan punya primary key atau unique index pada kolom kuncinya. Tambahkan index ke tabel yang sudah ada, atau biarkan Tambahkan CREATE TABLE membuat kuncinya.
  • MySQL atau SQL Server menolak PRIMARY KEY. Kolom kunci yang tetap teks dibuat sebagai TEXT (MySQL/MariaDB) atau NVARCHAR(MAX) (SQL Server), dan kedua database itu tidak bisa membuat index penuh untuk tipe tersebut. Buat tabelnya sendiri dengan kunci VARCHAR, lalu nonaktifkan Tambahkan CREATE TABLE.
  • SQL Server melaporkan bahwa tabel sudah ada. Skrip SQL Server memakai CREATE TABLE biasa. Nonaktifkan Tambahkan CREATE TABLE untuk memuat ke tabel yang sudah ada, atau aktifkan Awali dengan DROP TABLE IF EXISTS untuk menggantinya.
  • Skrip berhenti di tengah jalan. Pesan kesalahan database menyebut perintah yang gagal; penyebab umumnya adalah kunci ganda atau nilai yang tidak sesuai dengan tipe kolom di tabel yang sudah ada. Periksa file dengan Validasi CSV lalu jalankan skripnya lagi.

File besar dan batasnya

File hingga 25 MB, 100.000 baris, atau 2 juta sel dibuka dengan pratinjau langsung. File yang lebih besar dikonversi dalam mode streaming: pratinjau menampilkan 200 baris pertama, file dibaca dua kali per bagian (sekali untuk mengenali tipe dan lebar kolom, sekali untuk menulis skrip), dan unduhan mencakup semua baris. Satu skrip dibatasi hingga 4 GB.

Konversi berjalan di worker latar belakang pada tab ini, jadi halaman tetap responsif dan Batal bisa menghentikannya. File CSV tidak pernah dikirim ke server. Untuk mendapatkan file database siap pakai alih-alih skrip, gunakan CSV ke SQLite.

Contoh

Daftar pelanggan dengan ID bernol di depan, nama yang mengandung apostrof dan koma, serta paket yang kosong, dikonversi dengan pengaturan bawaan dan nama tabel customers. Dengan Deteksi angka dan true/false, signup_date menjadi DATE, monthly_fee menjadi NUMERIC dengan 29.00 tanpa kutip, dan active menjadi BOOLEAN dengan TRUE/FALSE, sedangkan customer_id tetap 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;

Tanya jawab

Mengapa semua kolom bertipe TEXT secara bawaan?

CSV tidak punya tipe data, dan tebakan yang salah bisa menghilangkan data: ID seperti 00412 yang disimpan sebagai integer menjadi 412. Teks memuat persis apa yang tertulis di file. Pilih Deteksi angka dan true/false jika Anda ingin kolom angka, boolean, dan DATE.

Database apa saja yang bisa menjalankan skripnya?

PostgreSQL, MySQL dan MariaDB, SQLite, serta SQL Server, masing-masing dengan cara pengutipan identifier, escaping string, nilai boolean, dan sintaksis upsert sendiri. Pilih Database yang sesuai sebelum mengunduh; skrip yang ditulis untuk satu database tidak bisa dipakai begitu saja di database lain.

Bisakah alat ini membuat perintah COPY atau LOAD DATA alih-alih INSERT?

Tidak. Skripnya memakai perintah standar INSERT, UPSERT, UPDATE, atau DELETE. Untuk pemuatan yang sangat besar, pertimbangkan bulk loader bawaan database Anda, seperti COPY di PostgreSQL atau LOAD DATA di MySQL, yang membaca CSV secara langsung.

Standar dan referensi