Ir para a ferramenta
ViewCSV
Sem upload de arquivos

Converter CSV em comandos SQL INSERT

orders.csv· DADOS DE EXEMPLO15 linhas · 8 colunas
Colunas-chave
Obrigatórias para UPSERT, UPDATE e DELETE; viram a chave primária ao criar a tabela.
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', 'Laura Costa', 'Porto Alegre', 'Desk lamp', '6', '224.92', '2026-01-15', 'shipped'),
  ('001042', 'Arthur Alves', 'Fortaleza', 'Monitor 27"', '1', '172.72', '2026-02-11', 'refunded'),
  ('001043', 'Miguel Costa', 'Rio de Janeiro', 'Coffee beans 1kg', '7', '165.86', '2026-03-07', 'shipped'),
  ('001044', 'Gael Rodrigues', 'Belo Horizonte', 'Monitor 27"', '1', '131.36', '2026-04-23', 'shipped'),
  ('001045', 'Alice Oliveira', 'Porto Alegre', 'USB-C cable', '8', NULL, '2026-05-25', 'shipped'),
  ('001046', 'Helena Souza', 'Salvador', 'Coffee beans 1kg', '1', '71.08', '2026-06-08', 'refunded'),
  ('001047', ' Laura Gomes ', 'Porto Alegre', 'Coffee beans 1kg', '3', '89.84', '2026-07-16', 'pending'),
  ('001048', 'Théo Oliveira', 'Fortaleza', 'Notebook A5', '7', '49.50', '2026-08-26', 'shipped'),
  ('001049', 'Helena Rodrigues', 'Salvador', 'Desk lamp', '3', '54.27', '2026-09-27', 'paid'),
  ('001050', 'Heitor Santos', 'Curitiba', 'Desk lamp', '6', '138.90', '2026-01-05', 'pending'),
  ('001051', 'Helena Ferreira', 'Curitiba', 'USB-C cable', '7', '6.10', '2026-02-03', 'refunded'),
  ('001052', 'Valentina Pereira', 'Belo Horizonte', 'Chair, ergonomic', '3', '106.72', '2026-03-09', 'shipped'),
  ('001053', 'Laura Alves', 'Fortaleza', 'Notebook A5', '6', '239.22', '2026-04-12', 'pending'),
  ('001054', 'Valentina Souza', 'São Paulo', 'Chair, ergonomic', '9', '154.44', '2026-05-25', 'pending'),
  ('001043', 'Miguel Costa', 'Rio de Janeiro', 'Coffee beans 1kg', '7', '165.86', '2026-03-07', 'shipped');
COMMIT;

15 linhas · 1 arquivo

Abra ou cole um arquivo CSV, escolha o Banco de dados e o Comando, e o script aparece ao lado das opções. Por padrão, ele sai como uma transação do PostgreSQL com um CREATE TABLE IF NOT EXISTS de colunas TEXT e INSERTs de 100 linhas cada, então 00412 continua '00412'. Escolha Detectar números e true/false quando a tabela precisar de colunas numéricas, booleanas e DATE. A conversão acontece no seu navegador, e o arquivo nunca é enviado.

Como converter CSV em SQL

  1. Abra um arquivo .csv, .tsv ou .txt, arraste-o para a ferramenta ou cole as linhas. O delimitador é detectado sozinho; ajuste-o, a linha de cabeçalho ou uma codificação antiga como Windows-1252 em Configurações de importação.
  2. Escolha o Banco de dados: PostgreSQL, MySQL / MariaDB, SQLite ou SQL Server. Confira o Nome da tabela, que começa como o nome do arquivo com espaços e pontuação trocados por sublinhados (sales report.csv vira sales_report).
  3. Escolha o Comando e, para UPSERT, UPDATE ou DELETE, marque as Colunas-chave que identificam cada linha.
  4. Revise a prévia, depois clique em Copiar ou baixe o arquivo .sql e rode-o no seu cliente de banco de dados, por exemplo com psql -f data.sql.

Para gerar scripts de muitos arquivos com as mesmas configurações, escolha Lote: converter vários arquivos. Os arquivos são convertidos um a um, e os scripts são baixados juntos em um único ZIP.

Comandos e opções

INSERTComandos INSERT INTO … VALUES com várias linhas. Linhas por INSERT define quantas linhas entram em cada comando (de 1 a 1.000, padrão 100); o SQL Server recusa mais de 1.000.
UPSERT (inserir ou atualizar)Um comando por linha que a insere ou atualiza a linha existente com a mesma chave: ON CONFLICT (…) DO UPDATE SET … = excluded.… no PostgreSQL e no SQLite, ON DUPLICATE KEY UPDATE no MySQL e MERGE no SQL Server. A tabela de destino precisa de chave primária ou índice único nas colunas-chave.
UPDATEUPDATE … SET … WHERE key = … para cada linha; as colunas-chave não são alteradas. Se todas as colunas forem chave, não há o que atualizar, e nenhum comando é gerado.
DELETEDELETE FROM … WHERE key = … para cada linha. Um valor de chave vazio vira IS NULL.
Colunas-chaveObrigatórias para UPSERT, UPDATE e DELETE; a ferramenta não gera nenhum desses comandos sem uma chave no WHERE. Com Adicionar CREATE TABLE, as colunas-chave viram NOT NULL e formam a PRIMARY KEY.
Adicionar CREATE TABLEVem ativada. Grava CREATE TABLE IF NOT EXISTS (CREATE TABLE simples no SQL Server ou depois de um DROP).
Começar com DROP TABLE IF EXISTSSubstitui uma tabela existente com o mesmo nome. Vem desativada; a tabela antiga e os dados dela se perdem quando o script roda.
Envolver em uma transaçãoVem ativada: BEGIN; … COMMIT; (START TRANSACTION; no MySQL, BEGIN TRANSACTION; no SQL Server).
Gravar células vazias como NULLVem ativada. Desative para gravar células vazias como ''.

Tipos de coluna e aspas

Com Manter todos os valores como texto (o padrão), toda coluna é TEXT (NVARCHAR(MAX) no SQL Server) e todo valor é um literal de string entre aspas, então zeros à esquerda, IDs longos e datas em formatos incomuns são carregados sem mudança.

Com Detectar números e true/false, uma coluna só recebe um tipo quando todos os valores preenchidos se encaixam nele:

Números inteirosINTEGER, ou BIGINT quando algum valor tem mais de 9 dígitos. Os valores são gravados sem aspas. Números com zeros à esquerda ou acima de 9.007.199.254.740.991 mantêm a coluna como texto.
Decimais (até 15 algarismos significativos)NUMERIC no PostgreSQL, DECIMAL(p,s) dimensionado pelos dados no MySQL e no SQL Server, REAL no SQLite. Uma vírgula decimal, como em 1,5, mantém a coluna como texto.
true / false (maiúsculas ou minúsculas)BOOLEAN com TRUE/FALSE no PostgreSQL e no MySQL, BIT com 1/0 no SQL Server, INTEGER com 1/0 no SQLite.
Datas no formato AAAA-MM-DDDATE, com valores entre aspas como '2026-03-01'; TEXT no SQLite. Data e hora juntas e outros formatos de data continuam como texto.
  • Nomes de tabela e de coluna vão entre aspas exatamente como foram escritos, então espaços, palavras reservadas e nomes em escritas não latinas funcionam: "order date" no PostgreSQL e no SQLite, ` order date no MySQL, [order date]` no SQL Server. Caracteres de aspas dentro do nome são duplicados.
  • Nos valores, a aspa simples é duplicada (O'Brien vira 'O''Brien'). No MySQL, as barras invertidas também são duplicadas, porque o MySQL trata \ como escape por padrão. Os literais do SQL Server recebem o prefixo N, para preservar o texto Unicode.
  • Quebras de linha dentro de um valor CSV entre aspas continuam dentro do literal de string do SQL.
  • A maioria dos bancos de dados não armazena caracteres NUL; eles são removidos, e a ferramenta informa quantos.

Quando o script SQL não roda

  • O script ficou todo em uma coluna. O delimitador foi detectado errado; defina-o em Configurações de importação e abra o arquivo de novo.
  • Uma coluna numérica saiu como TEXT. Pelo menos um valor não é um número simples, por exemplo 12 kg, 1,5 ou 007. Encontre-o no visualizador de CSV ou corrija a coluna com Limpar dados do CSV.
  • O UPSERT falha por falta de restrição. ON CONFLICT e ON DUPLICATE KEY só funcionam quando a tabela de destino tem chave primária ou índice único nas colunas-chave. Crie o índice na tabela existente, ou deixe que Adicionar CREATE TABLE crie a chave.
  • O MySQL ou o SQL Server recusa a PRIMARY KEY. Uma coluna-chave que continua como texto é criada como TEXT (MySQL/MariaDB) ou NVARCHAR(MAX) (SQL Server), e nenhum dos dois bancos consegue indexar esses tipos por inteiro. Crie a tabela você mesmo com uma chave VARCHAR e depois desative Adicionar CREATE TABLE.
  • O SQL Server avisa que a tabela já existe. Os scripts para SQL Server usam CREATE TABLE simples. Desative Adicionar CREATE TABLE para carregar na tabela existente, ou ative Começar com DROP TABLE IF EXISTS para substituí-la.
  • O script para no meio. O erro do banco de dados aponta o comando que falhou; as causas mais comuns são chave duplicada ou um valor que não cabe no tipo de coluna de uma tabela existente. Confira o arquivo com Validar CSV e rode o script de novo.

Arquivos grandes e limites

Arquivos de até 25 MB, 100.000 linhas ou 2 milhões de células abrem com prévia ao vivo. Arquivos maiores são convertidos em modo de streaming: a prévia mostra as primeiras 200 linhas, o arquivo é lido duas vezes, em partes (uma para descobrir os tipos e as larguras das colunas, outra para gravar o script), e o download cobre todas as linhas. Cada script tem limite de 4 GB.

A conversão roda em um worker em segundo plano nesta aba, então a página continua respondendo e Cancelar interrompe o processo. O CSV nunca é enviado a um servidor. Para receber um arquivo de banco de dados pronto em vez de um script, use CSV para SQLite.

Exemplo: uma lista de clientes como INSERTs do PostgreSQL

Uma lista de clientes com um ID que começa em zero, um nome com apóstrofo e vírgula e um plano vazio, convertida com as configurações padrão e o nome de tabela customers. Com Detectar números e true/false, signup_date vira DATE, monthly_fee vira NUMERIC com 29.00 sem aspas e active vira BOOLEAN com TRUE/FALSE, enquanto customer_id continua 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;

Perguntas frequentes

Por que toda coluna sai como TEXT por padrão?

O CSV não tem tipos, e um palpite errado faz perder dados: um ID como 00412 guardado como inteiro vira 412. Como texto, a tabela recebe exatamente o que está no arquivo. Escolha Detectar números e true/false quando quiser colunas numéricas, booleanas e DATE.

Em quais bancos de dados o script roda?

PostgreSQL, MySQL e MariaDB, SQLite e SQL Server, cada um com suas próprias regras de aspas nos identificadores, escape de strings, valores booleanos e sintaxe de upsert. Escolha o Banco de dados certo antes de baixar; um script gerado para um não serve para os outros.

Dá para gerar comandos COPY ou LOAD DATA em vez de INSERTs?

Não. O script usa comandos INSERT, UPSERT, UPDATE ou DELETE padrão. Para cargas muito grandes, considere a ferramenta de carga em massa do próprio banco, como COPY no PostgreSQL ou LOAD DATA no MySQL, lendo o CSV diretamente.

Padrões e referências