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
- Abre un archivo
.csv,.tsvo.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. - 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.csvpasa a sersales_report). - Elige la Instrucción y, para UPSERT, UPDATE o DELETE, marca las Columnas clave que identifican cada fila.
- Revisa la vista previa y pulsa Copiar o descarga el archivo
.sqlpara ejecutarlo con tu cliente de base de datos, por ejemplopsql -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
| INSERT | Instrucciones 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. |
| UPDATE | UPDATE … 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. |
| DELETE | DELETE FROM … WHERE key = … para cada fila. Un valor de clave vacío se convierte en IS NULL. |
| Columnas clave | Obligatorias 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 TABLE | Activada 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 EXISTS | Sustituye 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ón | Activada de forma predeterminada: BEGIN; … COMMIT; (START TRANSACTION; en MySQL, BEGIN TRANSACTION; en SQL Server). |
| Escribir las celdas vacías como NULL | Activada 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 enteros | INTEGER, 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-DD | DATE, 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 dateen MySQL,[order date]` en SQL Server. Los caracteres de comillas que contengan se duplican. - En los valores, la comilla simple se duplica (
O'Brienpasa 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 prefijoNpara 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,5o007. 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 CONFLICTyON DUPLICATE KEYsolo 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) oNVARCHAR(MAX)(SQL Server), y ninguna de las dos bases de datos puede indexar esos tipos completos. Crea tú la tabla con una claveVARCHARy desactiva Añadir CREATE TABLE. - SQL Server indica que la tabla ya existe: los scripts de SQL Server usan un
CREATE TABLEsimple. 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.
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;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.