Ir a la herramienta
ViewCSV
Sin subir archivos

Convertir CSV en sentencias SQL INSERT

orders.csv· DATOS DE EJEMPLO15 filas · 8 columnas
Columnas clave
Obligatorias para UPSERT, UPDATE y DELETE; se usan como clave primaria al crear la tabla.
Tipos de valor
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', 'Martina Sánchez', 'Barcelona', 'Monitor 27"', '6', '231.53', '2026-01-08', 'shipped'),
  ('001042', 'Mateo Martínez', 'Bilbao', 'Notebook A5', '8', '143.73', '2026-02-08', 'paid'),
  ('001043', 'Valeria Gómez', 'Málaga', 'USB-C cable', '6', '87.50', '2026-03-25', 'paid'),
  ('001044', 'Lucía Sánchez', 'Barcelona', 'Notebook A5', '1', '91.58', '2026-04-08', 'paid'),
  ('001045', 'Valeria López', 'Málaga', 'Desk lamp', '3', NULL, '2026-05-05', 'pending'),
  ('001046', 'Martina López', 'Madrid', 'Monitor 27"', '8', '79.06', '2026-06-08', 'pending'),
  ('001047', ' Sofía Rodríguez ', 'Zaragoza', 'Coffee beans 1kg', '5', '64.50', '2026-07-23', 'paid'),
  ('001048', 'Daniel López', 'Sevilla', 'Desk lamp', '6', '105.65', '2026-08-14', 'pending'),
  ('001049', 'Pablo Gómez', 'Málaga', 'Chair, ergonomic', '7', '57.68', '2026-09-09', 'pending'),
  ('001050', 'Pablo García', 'Barcelona', 'Desk lamp', '6', '206.44', '2026-01-14', 'shipped'),
  ('001051', 'Mateo Pérez', 'Barcelona', 'Chair, ergonomic', '5', '204.15', '2026-02-22', 'refunded'),
  ('001052', 'Leo Gómez', 'Zaragoza', 'USB-C cable', '1', '71.39', '2026-03-02', 'shipped'),
  ('001053', 'Hugo López', 'Barcelona', 'Coffee beans 1kg', '2', '23.63', '2026-04-12', 'refunded'),
  ('001054', 'Pablo Rodríguez', 'Zaragoza', 'Desk lamp', '7', '11.07', '2026-05-08', 'pending'),
  ('001043', 'Valeria Gómez', 'Málaga', 'USB-C cable', '6', '87.50', '2026-03-25', 'paid');
COMMIT;

15 filas · 1 archivo

Abre o pega un archivo CSV, elige la Base de datos y la Instrucción, y el script aparece junto a las opciones. De forma predeterminada es una transacción de PostgreSQL con un CREATE TABLE IF NOT EXISTS de columnas TEXT e INSERT de 100 filas cada uno, así que 00412 se queda como '00412'. Elige Detectar números y true/false cuando la tabla deba tener columnas numéricas, booleanas y DATE. La conversión se hace en tu navegador y el archivo nunca se sube.

Cómo convertir CSV a SQL

  1. Abre un archivo .csv, .tsv o .txt, suéltalo sobre la herramienta o pega las filas. El delimitador se detecta solo; en Configuración de importación puedes indicarlo, junto con la fila de encabezados o una codificación antigua como Windows-1252.
  2. Elige la Base de datos: PostgreSQL, MySQL / MariaDB, SQLite o SQL Server. Revisa el Nombre de la tabla, que al principio es el nombre del archivo con los espacios y signos de puntuación cambiados por guiones bajos (sales report.csv pasa a ser sales_report).
  3. Elige la Instrucción y, para UPSERT, UPDATE o DELETE, marca las Columnas clave que identifican cada fila.
  4. Revisa la vista previa y pulsa Copiar o descarga el archivo .sql para ejecutarlo con tu cliente de base de datos, por ejemplo psql -f data.sql.

Para generar scripts de muchos archivos con la misma configuración, elige Por lotes: convertir varios archivos. Los archivos se convierten uno tras otro y los scripts se descargan juntos en un único ZIP.

Instrucciones y opciones

INSERTInstrucciones INSERT INTO … VALUES de varias filas. Filas por INSERT fija cuántas filas comparten una instrucción (de 1 a 1000, 100 de forma predeterminada); SQL Server rechaza más de 1000.
UPSERT (insertar o actualizar)Una instrucción por fila que la inserta o actualiza la fila existente con la misma clave: ON CONFLICT (…) DO UPDATE SET … = excluded.… en PostgreSQL y SQLite, ON DUPLICATE KEY UPDATE en MySQL y MERGE en SQL Server. La tabla de destino necesita una clave primaria o un índice único sobre las columnas clave.
UPDATEUPDATE … SET … WHERE key = … para cada fila; las columnas clave no se modifican. Si todas las columnas son clave, no hay nada que actualizar y no se escribe ninguna instrucción.
DELETEDELETE FROM … WHERE key = … para cada fila. Un valor de clave vacío se convierte en IS NULL.
Columnas claveObligatorias para UPSERT, UPDATE y DELETE; la herramienta no escribe ninguna de esas instrucciones sin una clave en el WHERE. Con Añadir CREATE TABLE, las columnas clave pasan a ser NOT NULL y forman la PRIMARY KEY.
Añadir CREATE TABLEActivada de forma predeterminada. Escribe CREATE TABLE IF NOT EXISTS (un CREATE TABLE simple en SQL Server o después de un DROP).
Añadir antes DROP TABLE IF EXISTSSustituye una tabla existente con el mismo nombre. Desactivada de forma predeterminada; al ejecutar el script se pierden la tabla anterior y sus datos.
Envolver en una transacciónActivada de forma predeterminada: BEGIN; … COMMIT; (START TRANSACTION; en MySQL, BEGIN TRANSACTION; en SQL Server).
Escribir las celdas vacías como NULLActivada de forma predeterminada. Desactívala para escribir las celdas vacías como ''.

Tipos de columna y comillas

Con Mantener todos los valores como texto (predeterminado), todas las columnas son TEXT (NVARCHAR(MAX) en SQL Server) y cada valor es un literal de cadena entre comillas, así que los ceros a la izquierda, los identificadores largos y las fechas poco habituales se cargan sin cambios.

Con Detectar números y true/false, una columna solo recibe un tipo cuando todos sus valores no vacíos encajan en él:

Números enterosINTEGER, o BIGINT si algún valor tiene más de 9 dígitos. Los valores se escriben sin comillas. Los números con ceros a la izquierda o mayores que 9 007 199 254 740 991 hacen que la columna siga siendo texto.
Decimales (15 cifras significativas como máximo)NUMERIC en PostgreSQL, DECIMAL(p,s) dimensionado según los datos en MySQL y SQL Server, REAL en SQLite. Una coma decimal, como en 1,5, hace que la columna siga siendo texto.
true / false (en mayúsculas o minúsculas)BOOLEAN con TRUE/FALSE en PostgreSQL y MySQL, BIT con 1/0 en SQL Server, INTEGER con 1/0 en SQLite.
Fechas con formato AAAA-MM-DDDATE, con valores entre comillas como '2026-03-01'; TEXT en SQLite. Las fechas con hora y los demás formatos de fecha se quedan como texto.
  • Los nombres de tabla y de columna se citan tal como están escritos, así que funcionan los espacios, las palabras reservadas y los nombres en alfabetos no latinos: "order date" en PostgreSQL y SQLite, ` order date en MySQL, [order date]` en SQL Server. Los caracteres de comillas que contengan se duplican.
  • En los valores, la comilla simple se duplica (O'Brien pasa a ser 'O''Brien'). En MySQL también se duplican las barras invertidas, porque MySQL trata \ como carácter de escape de forma predeterminada. Los literales de SQL Server llevan el prefijo N para conservar el texto Unicode.
  • Los saltos de línea dentro de un valor CSV entre comillas se quedan dentro del literal de cadena SQL.
  • La mayoría de las bases de datos no pueden guardar caracteres NUL; se eliminan y la herramienta indica cuántos había.

Si el script SQL falla al ejecutarse

  • Todo el script queda en una sola columna: el delimitador se detectó mal. Indícalo en Configuración de importación y vuelve a abrir el archivo.
  • Una columna numérica sale como TEXT: al menos un valor no es un número simple, por ejemplo 12 kg, 1,5 o 007. Búscalo en el visor de CSV o corrige la columna con Limpiar datos de un CSV.
  • El UPSERT falla porque falta una restricción: ON CONFLICT y ON DUPLICATE KEY solo funcionan si la tabla de destino tiene una clave primaria o un índice único sobre las columnas clave. Añade el índice a la tabla existente o deja que Añadir CREATE TABLE cree la clave.
  • MySQL o SQL Server rechazan la PRIMARY KEY: una columna clave que sigue siendo texto se crea como TEXT (MySQL/MariaDB) o NVARCHAR(MAX) (SQL Server), y ninguna de las dos bases de datos puede indexar esos tipos completos. Crea tú la tabla con una clave VARCHAR y desactiva Añadir CREATE TABLE.
  • SQL Server indica que la tabla ya existe: los scripts de SQL Server usan un CREATE TABLE simple. Desactiva Añadir CREATE TABLE para cargar los datos en la tabla existente, o activa Añadir antes DROP TABLE IF EXISTS para sustituirla.
  • El script se detiene a mitad: el error de la base de datos indica qué instrucción ha fallado; lo habitual es una clave duplicada o un valor que no encaja en el tipo de una columna de una tabla existente. Revisa el archivo con Validar CSV y vuelve a ejecutar el script.

Archivos grandes y límites

Los archivos de hasta 25 MB, 100 000 filas o 2 millones de celdas se abren con vista previa en directo. Los más grandes se convierten leyéndolos por partes (en streaming): la vista previa muestra las primeras 200 filas, el archivo se lee dos veces (una para conocer los tipos y anchos de columna, otra para escribir el script) y la descarga incluye todas las filas. Cada script tiene un máximo de 4 GB.

La conversión se ejecuta en un proceso en segundo plano dentro de esta pestaña, así que la página sigue respondiendo y Cancelar la detiene. El CSV nunca se envía a un servidor. Si prefieres un archivo de base de datos ya listo en lugar de un script, usa CSV a SQLite.

Ejemplo: una lista de clientes como INSERT de PostgreSQL

Una lista de clientes con un identificador con cero a la izquierda, un nombre con apóstrofo y coma, y un plan vacío, convertida con la configuración predeterminada y el nombre de tabla customers. Con Detectar números y true/false, signup_date pasa a DATE, monthly_fee a NUMERIC con 29.00 sin comillas y active a BOOLEAN con TRUE/FALSE, mientras que customer_id se queda como 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;

Preguntas frecuentes

¿Por qué todas las columnas son TEXT de forma predeterminada?

CSV no tiene tipos, y adivinar mal hace perder datos: un identificador como 00412 guardado como entero se convierte en 412. Como texto se carga exactamente lo que dice el archivo. Elige Detectar números y true/false cuando quieras columnas numéricas, booleanas y DATE.

¿En qué bases de datos funciona el script?

PostgreSQL, MySQL y MariaDB, SQLite y SQL Server, cada una con su forma de citar identificadores, escapar cadenas, escribir booleanos y hacer UPSERT. Elige la Base de datos correspondiente antes de descargar; un script escrito para una no sirve para las demás.

¿Puede generar comandos COPY o LOAD DATA en lugar de INSERT?

No. El script usa instrucciones INSERT, UPSERT, UPDATE o DELETE estándar. Para cargas muy grandes, plantéate usar la herramienta de carga masiva de tu base de datos, como COPY en PostgreSQL o LOAD DATA en MySQL, que leen el CSV directamente.

Normas y referencias